面向初学者的 Python Pandas - 完整指南(第 2 部分)
在本文中,我们将继续学习 Python Pandas。我们将了解如何从文件中读取 DataFrame 以及对初学者来说最重要的 Pandas 运算符。
在该系列的上一篇文章中,我们了解了 Pandas 中的基本概念,例如“什么是 Pandas?”Series
和DataFrame
. 如果您不记得,请单击此处返回第 1 部分。
初学者的 Python Pandas(华盛顿邮报摄)
如何阅读和写作 DataFrame
在 Pandas 库的支持下,读取数据非常简单。我们可以从各种数据源加载数据,例如 CSV、JSON 或 Excel 文件。因为学习的目的,我们会尝试用各种数据源加载数据。
JSON文件
假设我们有一个 JSON 文件,其中包含与产品库存相关的数据,如下所示。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-string-color)">"CAN"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-string-color)">"Headphone"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-string-color)">"Laptop"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">5</span>
<span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-string-color)">"SGN"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-string-color)">"Headphone"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">3</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-string-color)">"Laptop"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">8</span>
<span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-string-color)">"SIN"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-string-color)">"Headphone"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-string-color)">"Laptop"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">5</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
read_json
然后我们可以使用pandas的功能轻松读取 JSON 文件。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">pandas</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">pd</span>
<span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">read_json</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"data.json"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result:
# CAN SGN SIN
# headphone 1 3 0
# laptop 5 8 5
#
</span></code></span></span>
将数据写入 JSON 文件
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">to_json</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"exported_data.json"</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>
CSV 文件
使用前面示例中的相同演示数据。但是,文件格式是 CSV。文件中的数据如下:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>,CAN,SGN,SIN
headphone,1,3,0
laptop,5,8,5
</code></span></span>
使用加载数据到 DataFrame read_csv
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">pandas</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">pd</span>
<span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">read_csv</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"data.csv"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result:
# Unnamed: 0 CAN SGN SIN
# 0 headphone 1 3 0
# 1 laptop 5 8 5
#
</span></code></span></span>
在上面的代码中,read_csv
默认生成索引列。但是,我们希望第一列(耳机、笔记本电脑)是索引列。所以传递index_col
参数来read_csv
让它知道哪一列将被索引。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">pandas</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">pd</span>
<span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">read_csv</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"data.csv"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">index_col</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result:
# CAN SGN SIN
# headphone 1 3 0
# laptop 5 8 5
#
</span></code></span></span>
将 DataFrame 写入 CSV 文件
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">to_csv</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"exported_data.csv"</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>
Excel文件
read_excel
使用函数从excel文件中读取数据。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">pandas</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">pd</span>
<span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">read_excel</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"data.xlsx"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">index_col</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result:
# CAN SGN SIN
# headphone 1 3 0
# laptop 5 8 5
#
</span></code></span></span>
将DataFrame写入excel文件
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">to_excel</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'exported_data.xlsx'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">sheet_name</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">'Sheet1'</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>
重要的 Pandas 运算符
在学习 pandas 运算符之前,我们将创建 DataFrame 并在 pandas 运算符部分的示例中使用它。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">pandas</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">pd</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">numpy</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">np</span>
<span style="color:var(--syntax-text-color)">dates</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">date_range</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'20190101'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">periods</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-literal-color)">50</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">DataFrame</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">np</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">random</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">randn</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">50</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">4</span><span style="color:var(--syntax-text-color)">),</span> <span style="color:var(--syntax-text-color)">index</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">dates</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">columns</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">list</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'ABCD'</span><span style="color:var(--syntax-text-color)">))</span>
</code></span></span>
查看您的数据
现在我们有一个 50 行的 DataFrame。它太大了,无法打印。在现实生活中,行数会大很多倍。因此,我们首先应该知道的是如何打印出几行以作为视觉参考。
我们将用于.head()
显示您数据的前 5 行
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">head</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-comment-color)"># Result:
# A B C D
# 2019-01-01 -1.005372 0.142613 -0.181516 1.036709
# 2019-01-02 0.790087 0.294033 -0.602744 1.035578
# 2019-01-03 -1.703856 0.126258 1.080593 -0.421066
# 2019-01-04 -0.558818 -2.923537 -1.721127 -0.275644
# 2019-01-05 -1.408334 -0.860980 0.052589 1.104063
</span></code></span></span>
如果我们想打印前 10 行而不是 5 行,我们该怎么办?在这种情况下,我们可以传递一个数字.head()
来定义要打印的行数。例如:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">head</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">10</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result:
# A B C D
# 2019-01-01 -1.005372 0.142613 -0.181516 1.036709
# 2019-01-02 0.790087 0.294033 -0.602744 1.035578
# 2019-01-03 -1.703856 0.126258 1.080593 -0.421066
# 2019-01-04 -0.558818 -2.923537 -1.721127 -0.275644
# 2019-01-05 -1.408334 -0.860980 0.052589 1.104063
# 2019-01-06 0.418509 0.607834 0.017931 0.748909
# 2019-01-07 0.336740 -0.406930 1.420234 -1.702862
# 2019-01-08 0.739592 1.051292 -0.757623 -1.156324
# 2019-01-09 -0.225760 0.416810 0.128996 -1.450296
# 2019-01-10 0.527811 1.771893 -0.551995 1.101953
</span></code></span></span>
我们可以.tail()
用来获取最后 5 行的数据。和 一样.head()
,我们可以传递一个数字来确定要打印的行数。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">tail</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">7</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result:
# A B C D
# 2019-02-13 0.834528 2.912336 -0.957908 0.758701
# 2019-02-14 -0.866577 -0.886605 -0.339376 1.296223
# 2019-02-15 0.324452 -1.030220 0.854473 1.471936
# 2019-02-16 2.657040 -1.169546 -1.746896 -0.745877
# 2019-02-17 1.494073 -0.709933 -0.086347 -0.512125
# 2019-02-18 -1.455421 -0.370378 1.475331 -0.867604
# 2019-02-19 -1.542814 0.355690 -0.705522 0.069457
</span></code></span></span>
显示数据信息
.info()
将向您显示数据的摘要信息
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">info</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-comment-color)"># Result
# <class 'pandas.core.frame.DataFrame'>
# DatetimeIndex: 50 entries, 2019-01-01 to 2019-02-19
# Freq: D
# Data columns (total 4 columns):
# A 50 non-null float64
# B 50 non-null float64
# C 50 non-null float64
# D 50 non-null float64
# dtypes: float64(4)
# memory usage: 2.0 KB
</span></code></span></span>
DataFrame的选择、添加和删除
到目前为止,我们知道了解 Pandas 数据结构,如何创建、加载和编写DataFrame
. 在本节中,我们将学习您需要经常使用的选择、添加和删除方法。
按列
选择一列数据的简单方法是使用括号。例如:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'A'</span><span style="color:var(--syntax-text-color)">]</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">head</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-comment-color)"># Result
# 2019-01-01 -1.005372
# 2019-01-02 0.790087
# 2019-01-03 -1.703856
# 2019-01-04 -0.558818
# 2019-01-05 -1.408334
# Freq: D, Name: A, dtype: float64
</span></code></span></span>
我们可以在括号内选择多列。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[[</span><span style="color:var(--syntax-string-color)">'A'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'D'</span><span style="color:var(--syntax-text-color)">]]</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">head</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-comment-color)"># Result
# A D
# 2019-01-01 -1.005372 1.036709
# 2019-01-02 0.790087 1.035578
# 2019-01-03 -1.703856 -0.421066
# 2019-01-04 -0.558818 -0.275644
# 2019-01-05 -1.408334 1.104063
</span></code></span></span>
按行
索引数据的另一种选择是使用.loc
and .iloc
。请记住,此语法仅用于按行索引。下面是它的语法:
.loc
:名字的位置.iloc
:按索引号定位
如果我们只将 1 个参数传递给 .loc 或 .iloc 。它理解参数是默认的行。现在我们尝试获取标记为“2019-02-19”的行。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">loc</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'2019-02-19'</span><span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-comment-color)"># Result
# A -1.542814
# B 0.355690
# C -0.705522
# D 0.069457
# Name: 2019-02-19 00:00:00, dtype: float64
</span></code></span></span>
现在我们将选择结果中的特定列
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">loc</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'2019-02-19'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'A'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'B'</span><span style="color:var(--syntax-text-color)">]]</span>
<span style="color:var(--syntax-comment-color)"># Result
# A -1.542814
# B 0.355690
# Name: 2019-02-19 00:00:00, dtype: float64
</span></code></span></span>
因为行标签是时间,所以我们也可以按时间范围获取行。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">loc</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'2019-02-02'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'2019-02-5'</span><span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-comment-color)"># Result
# A B C D
# 2019-02-02 1.343458 -0.940805 -0.671073 -0.102026
# 2019-02-03 0.815890 1.190464 -0.479341 -0.105754
# 2019-02-04 -0.256803 0.595940 0.279049 2.010431
# 2019-02-05 0.311328 -0.111790 -0.515169 -0.014552
</span></code></span></span>
与 类似.loc
,我们可以使用.iloc
来选择一个或多个特定的索引号。以下示例用于选择多个索引号:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">iloc</span><span style="color:var(--syntax-text-color)">[[</span><span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">3</span><span style="color:var(--syntax-text-color)">],:]</span>
<span style="color:var(--syntax-comment-color)"># Result
# A B C D
# 2019-01-02 0.790087 0.294033 -0.602744 1.035578
# 2019-01-04 -0.558818 -2.923537 -1.721127 -0.275644
</span></code></span></span>
或者选择一片索引:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">iloc</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">10</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-literal-color)">13</span><span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-comment-color)"># Result
# A B C D
# 2019-01-11 0.530191 -1.301325 -0.050186 0.267728
# 2019-01-12 -0.652778 -0.611594 0.291840 -0.935883
# 2019-01-13 1.602400 -0.137409 1.002766 0.820419
</span></code></span></span>
请注意,我们正在获取行 [10:13] 但我们得到的是从第 10 行到第 12 行的数据。第 13 行不在结果中。
切片.iloc
遵循与切片列表相同的规则。最后一个索引处的对象不包含在结果中。
通过可调用选择
.loc
,.iloc
并且[]
索引也可以接受可调用的。该函数必须是具有一个参数的函数。为获得最佳实践,Python 开发人员通常使用lambda
. 您可以参考我们的文章了解有关函数的更多详细信息lambda
(Python Lambda 函数)
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">loc</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-declaration-color)">lambda</span> <span style="color:var(--syntax-text-color)">row</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">row</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">D</span> <span style="color:var(--syntax-error-color)">></span> <span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-comment-color)"># Result:
# A B C D
# 2019-01-01 -0.862970 1.312603 -0.427154 1.222134
# 2019-01-03 0.173703 -0.258924 -0.014464 0.320602
# 2019-01-04 0.252102 -1.914325 0.649628 0.885115
# 2019-01-06 -0.461437 0.063366 0.569461 0.427437
# 2019-01-08 -0.956210 0.067605 -2.273661 0.833149
# 2019-01-09 0.340620 -1.976085 -1.144538 0.425282
# 2019-01-11 0.530191 -1.301325 -0.050186 0.267728
# 2019-01-13 1.602400 -0.137409 1.002766 0.820419
# 2019-01-15 -1.083804 1.790858 -0.301093 0.674832
# 2019-01-16 -0.143779 2.104730 -1.228123 1.568482
# 2019-01-22 -0.821942 1.381137 -1.812166 0.785756
# 2019-01-23 -1.404428 0.563167 2.138703 2.387186
# 2019-01-28 0.271000 -0.633658 -0.839952 0.816997
# 2019-01-29 -0.259307 1.638976 -0.648043 0.715521
# 2019-02-01 0.109348 -0.624031 -0.283261 0.138264
# 2019-02-03 -1.319024 -0.131162 2.011317 1.312116
# 2019-02-04 0.910435 -0.636221 -0.857388 0.456990
</span></code></span></span>
处理重复数据
在处理大型数据集时,处理重复数据是一种常见情况。我们可以遍历每一行数据并检查它是否与其他数据重复,但这会非常缓慢和复杂。
幸运的是,DataFrame 类提供了帮助开发人员轻松处理重复数据的功能。我们可以按行或按列查找重复数据。现在我们将弄清楚它是如何工作的。
duplicated
它将在每个重复的地方返回一个带有True的布尔系列。drop_duplicates
删除重复的行。
默认情况下,第一个观察到的行被认为是唯一的。但是,每个方法都有一个keep
参数来指定保留哪一行。
keep='first'
:默认值,除了第一次观察到的数据外,标记重复。keep='last'
:标记重复,除了最后观察到的数据。keep=False
:标记所有都是重复的。
在进行示例之前,我们将创建如下数据
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">pandas</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">pd</span>
<span style="color:var(--syntax-text-color)">employees</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">[(</span><span style="color:var(--syntax-string-color)">'Mark'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">34</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Toronto'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Kana'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">30</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Delhi'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Tam'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">26</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Ha Noi'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Kana'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">30</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Delhi'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Kana'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">30</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Delhi'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Kana'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">30</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Delhi'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Hashima'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">40</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'London'</span><span style="color:var(--syntax-text-color)">),</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'Rook'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">30</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Delhi'</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">pd</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">DataFrame</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">employees</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">columns</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'Name'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'Age'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'City'</span><span style="color:var(--syntax-text-color)">])</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Name Age City
# 0 Mark 34 Toronto
# 1 Kana 30 Delhi
# 2 Tam 26 Ha Noi
# 3 Kana 30 Delhi
# 4 Kana 30 Delhi
# 5 Kana 30 Delhi
# 6 Hashima 40 London
# 7 Rook 30 Delhi
</span></code></span></span>
按行
查找重复的行:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># The same with data.duplicated(keep='first')
</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">duplicated</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-comment-color)"># Result
# 0 False
# 1 False
# 2 False
# 3 True
# 4 True
# 5 True
# 6 False
# 7 False
# dtype: bool
</span></code></span></span>
结果是一个系列数据,每行标记它是否重复。如果我们使用结果来选择数据,我们将得到重复结果的值。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">duplicated</span><span style="color:var(--syntax-text-color)">()]</span>
<span style="color:var(--syntax-comment-color)"># Result
# Name Age City
# 3 Kana 30 Delhi
# 4 Kana 30 Delhi
# 5 Kana 30 Delhi
</span></code></span></span>
删除重复的行,将第一个观察到的数据保留为默认值
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">drop_duplicates</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-comment-color)"># Result
# Name Age City
# 0 Mark 34 Toronto
# 1 Kana 30 Delhi
# 2 Tam 26 Ha Noi
# 6 Hashima 40 London
# 7 Rook 30 Delhi
</span></code></span></span>
现在让我们看看如果有什么区别 keep='last'
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">drop_duplicates</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">keep</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">'last'</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result
# Name Age City
# 0 Mark 34 Toronto
# 2 Tam 26 Ha Noi
# 5 Kana 30 Delhi
# 6 Hashima 40 London
# 7 Rook 30 Delhi
</span></code></span></span>
现在 keep=False
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">drop_duplicates</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">keep</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">False</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-comment-color)"># Result
# Name Age City
# 0 Mark 34 Toronto
# 2 Tam 26 Ha Noi
# 6 Hashima 40 London
# 7 Rook 30 Delhi
</span></code></span></span>
按列
我们能够选择特定的列来确定数据是否重复
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">duplicated</span><span style="color:var(--syntax-text-color)">([</span><span style="color:var(--syntax-string-color)">'Age'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'City'</span><span style="color:var(--syntax-text-color)">])]</span>
<span style="color:var(--syntax-comment-color)"># Result
# Name Age City
# 3 Kana 30 Delhi
# 4 Kana 30 Delhi
# 5 Kana 30 Delhi
# 7 Rook 30 Delhi
</span></code></span></span>
所选列的 drop_duplicates 的其他示例将在我们的 GitHub 中提供。如果需要,请检查它以获取更多详细信息。
应用功能
现在,例如,我们希望获得 30 岁以上的员工。不要遍历每个员工并检查员工是否超过 30 岁。相反,请利用 Pandas 库。它是apply()
功能。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'Age'</span><span style="color:var(--syntax-text-color)">]</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-text-color)">apply</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">lambda</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">></span> <span style="color:var(--syntax-literal-color)">30</span><span style="color:var(--syntax-text-color)">)]</span>
<span style="color:var(--syntax-comment-color)"># Result
# Name Age City
# 0 Mark 34 Toronto
# 6 Hashima 40 London
</span></code></span></span>
概括
在 Python 中使用 pandas 探索、清理、转换和可视化数据是数据科学的一项基本技能。本系列只是为初学者介绍了有关 Python Pandas 的非常基础的知识。在我们的GitHub 项目上找到本系列的完整示例。
如果您通过该系列找到了自己有用的信息,请分享给其他人,发表评论并订阅我们以获取未来帖子的通知。我们将非常感谢您抽出宝贵时间阅读这篇文章
如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~