Pandas 是基于 NumPy 的一个开源 Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。它的名字来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。简单地说,你可以把 Pandas 看作是 Python 版的 Excel。

我喜欢 Pandas 的原因之一,是因为它很酷,它能很好地处理来自一大堆各种不同来源的数据,比如 Excel 表格、CSV 文件、SQL 数据库,甚至还能处理存储在网页上的数据。

话不多说,让我们开始吧!

1. Series结构

Series是一种一维数组,和Numpy里的数组很相似。事实上,Series基本上就是基于Numpy的数据结构来的。但与Numpy不同的是,Series能为数组定义标签,也就是索引(index)然乎通过索引来访问数组中的数据。

In [1]:
import numpy as np
import pandas as pd

1.1 创建Series

创建一个Series的基本语法如下:

In [2]:
# my_series=pd.Series(data,index)
上面的data参数可以使任意数据对象!比如: - 字典 - list - 甚至是Numpy数组 index参数则是对data的索引,类似字典的key

Example 1.1: 从Python List创建一个Series, 用字符串对数字列表索引

In [3]:
countries = ['USA','Russia','China','France']
my_data = [100, 200, 300,150]
In [4]:
pd.Series(my_data,countries) #using countries as index my_data as data
Out[4]:
USA       100
Russia    200
China     300
France    150
dtype: int64
Noted!! index参数可以省略,缺省值为[0, 1,..., len(data)-1]。

Example 1.2: 从Numpy Array里创建Series

与Numpy数组不同的是,series能存放不同的数据类型

In [6]:
np_arr = np.array(my_data)
np_arr
Out[6]:
array([100, 200, 300, 150])
In [8]:
pd.Series(np_arr) #缺省index
Out[8]:
0    100
1    200
2    300
3    150
dtype: int32

Example 1.3: 从Python Dictionary里创建Series

pandas将字典的key自动变为index,values变为data

In [10]:
my_dict = {'a':50, 'b':40, 'd':60, 'c': 45}
my_dict
Out[10]:
{'a': 50, 'b': 40, 'd': 60, 'c': 45}
In [11]:
pd.Series(my_dict)
Out[11]:
a    50
b    40
d    60
c    45
dtype: int64

1.2 从Series里获取数据

访问,Series离得数据方式,和python字典基本一样

In [13]:
my_serie = pd.Series(my_data,countries)
my_serie
Out[13]:
USA       100
Russia    200
China     300
France    150
dtype: int64
In [14]:
my_serie['China']
Out[14]:
300

1.3 对Series进行算数操作

对series的算数运算是基于index进行的。我们可以用加减乘除(+ - × /)这样的运算符对两个Series进行运算。Pandas将会根据index,对相应的数据进行运算。结果以float数据类型出现,防止丢失精度

In [17]:
my_serie2 = pd.Series([100, 300, 230, 150],['USA','Canada','China','Japan'])
my_serie2
Out[17]:
USA       100
Canada    300
China     230
Japan     150
dtype: int64
In [18]:
my_serie
Out[18]:
USA       100
Russia    200
China     300
France    150
dtype: int64
In [19]:
my_serie-my_serie2
Out[19]:
Canada     NaN
China     70.0
France     NaN
Japan      NaN
Russia     NaN
USA        0.0
dtype: float64
In [20]:
my_serie+my_serie2
Out[20]:
Canada      NaN
China     530.0
France      NaN
Japan       NaN
Russia      NaN
USA       200.0
dtype: float64

index如果是字符串,按照字母顺序排列,如果没有相同的index就返回空值NaN

2. DataFrames 结构

Pandas 的 DataFrame(数据表)是一种 2 维数据结构,数据以表格的形式存储,分成若干行和列。通过 DataFrame,你能很方便地处理数据。常见的操作比如选取、替换行或列的数据,还能重组数据表、修改索引、多重筛选等。

2.1 创建 DataFrame

构建一个 DataFrame 对象的基本语法如下

In [21]:
# pd.DataFrame(data,index)

表中的每一列基本上就是一个 Series ,它们都用了同一个 index。因此,我们基本上可以把 DataFrame 理解成一组采用同样索引的 Series 的集合。如下例

Example 2.1 从Series字典创建dataframe

In [25]:
pd.DataFrame({'Name':pd.Series(['Bob','John','Ann','Bill']), 'Age':pd.Series([23, 24, 20,19]), 
             'Nationality': pd.Series(['USA','Canada','Japan','Germany'])})
Out[25]:
Name Age Nationality
0 Bob 23 USA
1 John 24 Canada
2 Ann 20 Japan
3 Bill 19 Germany
In [28]:
#自定义index给series,所有series必须同样的index
pd.DataFrame({'Name':pd.Series(['Bob','John','Ann','Bill'],['a','b','c','d']), 'Age':pd.Series([23, 24, 20,19],['a','b','c','d']), 
             'Nationality': pd.Series(['USA','Canada','Japan','Germany'],['a','b','c','d'])})
Out[28]:
Name Age Nationality
a Bob 23 USA
b John 24 Canada
c Ann 20 Japan
d Bill 19 Germany
In [29]:
#否则,比如['a','e','c','d']
pd.DataFrame({'Name':pd.Series(['Bob','John','Ann','Bill'],['a','e','c','d']), 'Age':pd.Series([23, 24, 20,19],['a','b','c','d']), 
             'Nationality': pd.Series(['USA','Canada','Japan','Germany'],['a','b','c','d'])})
Out[29]:
Name Age Nationality
a Bob 23.0 USA
b NaN 24.0 Canada
c Ann 20.0 Japan
d Bill 19.0 Germany
e John NaN NaN
In [26]:
#上面的例子可以拆分未如下表示
#Series:缺省index
# serie1=pd.Series(['Bob','John','Ann','Bill'])
# serie2=pd.Series([23, 24, 20,19])
# serie3=pd.Series(['USA','Canada','Japan','Germany'])
#字典my_dict={'Name':serie1, 'Age':serie2, 
#             'Nationality': serie3}
# pd.DataFrame(my_dict)

Example 2.2 从list字典创建dataframe

In [33]:
# 基本结构 pd.DataFrame(data,index)
# pd.DataFrame(dictionary_of_list,index)
my_dataframe=pd.DataFrame({'Name':['Bob','John','Ann','Bill'], 'Age':[23, 24, 20,19], 
             'Nationality': ['USA','Canada','Japan','Germany']}, index = ['a','b','c','d'])
my_dataframe
Out[33]:
Name Age Nationality
a Bob 23 USA
b John 24 Canada
c Ann 20 Japan
d Bill 19 Germany
In [34]:
#上面的例子可以拆分未如下表示
#list:缺省index
# list1=['Bob','John','Ann','Bill']
# list2= [23, 24, 20,19]
# list3=['USA','Canada','Japan','Germany']
#字典my_dict={'Name':list1, 'Age':list2, 
#             'Nationality': list3}
# pd.DataFrame(my_dict,index)

2.2 获取dataframe的内容

与Series相似, 数据获取使用 中括号 [] 的方式

2.2.1获取一列

比如获取上表格中的 "name" column:

In [37]:
my_dataframe['Name'] #获取Name
Out[37]:
a     Bob
b    John
c     Ann
d    Bill
Name: Name, dtype: object
In [38]:
#返回 type值
type(my_dataframe['Name'])
Out[38]:
pandas.core.series.Series

2.2.2 获取多列

In [41]:
# 错误例子如下 my_dataframe['Name','Nationality']
my_dataframe[['Name','Nationality']]
Out[41]:
Name Nationality
a Bob USA
b John Canada
c Ann Japan
d Bill Germany
In [43]:
type(my_dataframe[['Name','Nationality']])
Out[43]:
pandas.core.frame.DataFrame

2.3 编辑DataFrame

2.3.1 向DF里增加列

增加数据列有两种办法:

  • 可以从头开始定义一个 pd.Series,再把它放到表中,
  • 也可以利用现有的列来产生需要的新列。

先创建一个原始DataFrame

In [47]:
my_dict_of_series = {'Name':pd.Series(['Bob','John','Ann','Bill'],['a','b','c','d']), 'Age':pd.Series([23, 24, 20,19],['a','b','c','d']), 
             'Nationality': pd.Series(['USA','Canada','Japan','Germany'],['a','b','c','d'])}
pd.DataFrame(my_dict_of_series)
Out[47]:
Name Age Nationality
a Bob 23 USA
b John 24 Canada
c Ann 20 Japan
d Bill 19 Germany
In [49]:
# Methode 1:
# Add a new Serie in the dict
my_dict_of_series['Year'] =[2015,2016,2018,2017]
pd.DataFrame(my_dict_of_series)
Out[49]:
Name Age Nationality Year
a Bob 23 USA 2015
b John 24 Canada 2016
c Ann 20 Japan 2018
d Bill 19 Germany 2017
In [54]:
# Methode 2:
# 通过编辑其他的my_dict_of_series词条 来获得新的my_dict_of_series词条
my_dict_of_series['BirthYear'] = my_dict_of_series['Year']+my_dict_of_series['Age']
my_df=pd.DataFrame(my_dict_of_series)
my_df
Out[54]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038
d Bill 19 Germany 2017 2036

2.3.2 从 DataFrame 里删除行/列

想要删除某一行或一列,可以用 .drop() 函数。在使用这个函数的时候,你需要先指定具体的删除方向:

  • axis=0 对应的是行 row,
  • axis=1 对应的是列 column 。

请务必记住,除非用户明确指定,否则在调用 .drop() 的时候,Pandas 并不会真的永久性地删除这行/列。这主要是为了防止用户误操作丢失数据。

如果你确定要永久性删除某一行/列,你需要加上 inplace=True 参数

In [56]:
my_df.drop('BirthYear',axis =1)
Out[56]:
Name Age Nationality Year
a Bob 23 USA 2015
b John 24 Canada 2016
c Ann 20 Japan 2018
d Bill 19 Germany 2017
In [57]:
my_df
Out[57]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038
d Bill 19 Germany 2017 2036
In [58]:
my_df.drop('d',axis =0)
Out[58]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038
In [59]:
my_df
Out[59]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038
d Bill 19 Germany 2017 2036
In [60]:
## Really Delete Something
my_df.drop('d',axis =0,inplace=True)
In [61]:
my_df
Out[61]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038
In [62]:
my_df
Out[62]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038

2.3.3 获取 DataFrame 中的一行或多行数据

要获取某一行,你需要用:

  • .loc[] 来按'index'引用这一行,或者用
  • .iloc[] ,按这行在表中的'行数'来引用。
In [64]:
my_df.loc['a']
Out[64]:
Name            Bob
Age              23
Nationality     USA
Year           2015
BirthYear      2038
Name: a, dtype: object
In [65]:
my_df.iloc[0]
Out[65]:
Name            Bob
Age              23
Nationality     USA
Year           2015
BirthYear      2038
Name: a, dtype: object
In [67]:
my_df.iloc[[0,1]]
Out[67]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
In [68]:
my_df.loc[['a','b']]
Out[68]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040

同时你可以用 .loc[] 来指定具体的行列范围,并生成一个子数据表,就像在 NumPy 里做的一样。比如,提取 'c' 行中 'Name’ 列的内容,可以如下操作:

.loc[]选取某行某列 或表格的一部分表格

In [72]:
my_df.loc['a','Age'] #先行后列
Out[72]:
23
In [74]:
my_df.loc[['a','b'],['Age','Year']] #先行后列 用array表示行和列
Out[74]:
Age Year
a 23 2015
b 24 2016

2.3.4 条件筛选

用中括号 [] 的方式,除了直接指定选中某些列外,还能接收一个条件语句,然后筛选出符合条件的行/列。

比如,我们希望在下面这个表格中筛选出 'Age'>20 的行:

In [76]:
my_df[my_df['Age']>20]
Out[76]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040

我们希望在下面这个表格中筛选出 'Age'>20 的行的人的姓名

In [77]:
my_df[my_df['Age']>20]['Name']
Out[77]:
a     Bob
b    John
Name: Name, dtype: object

我们希望在下面这个表格中筛选出 'Age'>20 的行的人的姓名 和 国家

In [79]:
my_df[my_df['Age']>20][['Name','Nationality']]
Out[79]:
Name Nationality
a Bob USA
b John Canada
In [80]:
my_df['Age']>20
Out[80]:
a     True
b     True
c    False
Name: Age, dtype: bool
In [82]:
type(my_df['Age']>20)
Out[82]:
pandas.core.series.Series
In [81]:
my_df[my_df['Age']>20]
Out[81]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040

DataFrame的行索引可以使用Series of 真值表

注意!!!Series的index的顺序最好与DF一致

In [84]:
my_df[pd.Series([True, True, False],index=['a','b','c'])]
Out[84]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
In [86]:
my_df[pd.Series([True, True, False],index=['a','c','b'])]
/home/junyao/anaconda3/envs/dataanalysis/lib/python3.7/site-packages/ipykernel/__main__.py:1: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  if __name__ == '__main__':
Out[86]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
c Ann 20 Japan 2018 2038
In [87]:
# 查看返回类型 一个新的DataFrame
type(my_df[pd.Series([True, True, False],index=['a','b','c'])])
Out[87]:
pandas.core.frame.DataFrame

可以对DF继续进行操作处理

In [88]:
# 生成心得DF 且访问新的DF的某一列

my_df[pd.Series([True, True, False],index=['a','b','c'])]['Year']
Out[88]:
a    2015
b    2016
Name: Year, dtype: int64
In [90]:
# 生成心得DF 且访问新的DF的某一行
my_df[pd.Series([True, True, False],index=['a','b','c'])].iloc[1]
Out[90]:
Name             John
Age                24
Nationality    Canada
Year             2016
BirthYear        2040
Name: b, dtype: object

你可以用逻辑运算符 &(与)和 |(或)来链接多个条件语句,以便一次应用多个筛选条件到当前的 DataFrame 上。

举个栗子,你可以用下面的方法筛选出同时满足 'W'>0 和'X'>1 的行:

my_df[(condition1 )&(condition2 )]

In [91]:
my_df
Out[91]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038
In [93]:
my_df[(my_df['Age']>20) & (my_df['Year']>2015)]
Out[93]:
Name Age Nationality Year BirthYear
b John 24 Canada 2016 2040
In [94]:
my_df[(my_df['Age']>20) | (my_df['Year']>2015)]
Out[94]:
Name Age Nationality Year BirthYear
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038

2.4 重置 DataFrame 的索引

如果你觉得当前 DataFrame 的索引有问题,你可以用

.reset_index()

简单地把整个表的索引都重置掉。

这个方法将把目标 DataFrame 的索引保存在一个叫 "index" 的列中,而把表格的索引变成默认的从零开始的数字,也就是 [0, ..., len(data) - 1]。比如下面这样:

In [95]:
my_df.reset_index()
Out[95]:
index Name Age Nationality Year BirthYear
0 a Bob 23 USA 2015 2038
1 b John 24 Canada 2016 2040
2 c Ann 20 Japan 2018 2038

从上面的输出可见 表格多了一列名为index的列

In [105]:
my_df.drop('level_0',axis=1,inplace=True)
In [106]:
my_df
Out[106]:
index Name Age Nationality Year BirthYear
0 a Bob 23 USA 2015 2038
1 b John 24 Canada 2016 2040
2 c Ann 20 Japan 2018 2038

set_index()

In [107]:
my_df.set_index('index',inplace=True)
In [108]:
my_df
Out[108]:
Name Age Nationality Year BirthYear
index
a Bob 23 USA 2015 2038
b John 24 Canada 2016 2040
c Ann 20 Japan 2018 2038

.reset_index() 并不会永久改变你表格的索引,除非你调用的时候明确传入了 inplace 参数,比如:.reset_index(inplace=True)

In [109]:
my_df.reset_index(inplace=True)
In [110]:
my_df
Out[110]:
index Name Age Nationality Year BirthYear
0 a Bob 23 USA 2015 2038
1 b John 24 Canada 2016 2040
2 c Ann 20 Japan 2018 2038

2.5 多级索引(MultiIndex)以及命名索引的不同等级

多级索引其实就是一个由元组(Tuple)组成的数组,每一个元组都是独一无二的。你可以从一个包含许多数组的列表中创建多级索引(调用 MultiIndex.from_arrays ),也可以用一个包含许多元组的数组(调用 MultiIndex.from_tuples )或者是用一对可迭代对象的集合(比如两个列表,互相两两配对)来构建(调用MultiIndex.from_product )。

下面这个例子,我们从元组中创建多级索引:

In [118]:
outside=['0 level','0 level', '0 level', 'A level', 'A level', 'A level']
inside=[21,22,23,21,22,23]
my_index = list(zip(outside,inside))
my_index
Out[118]:
[('0 level', 21),
 ('0 level', 22),
 ('0 level', 23),
 ('A level', 21),
 ('A level', 22),
 ('A level', 23)]

!!!!!zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。!!!!!

2.5.1 pandas.MultiIndex.from_tuples(my_index) 生成一个多级索引对象

生成一个多级index

In [119]:
my_index=pd.MultiIndex.from_tuples(my_index) 
my_index
Out[119]:
MultiIndex(levels=[['0 level', 'A level'], [21, 22, 23]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])
In [130]:
#或者give a name 
my_index1 = list(zip(outside,inside))
my_index1
Out[130]:
[('0 level', 21),
 ('0 level', 22),
 ('0 level', 23),
 ('A level', 21),
 ('A level', 22),
 ('A level', 23)]

多级索引需要名字

In [137]:
my_index1=pd.MultiIndex.from_tuples(my_index1, names=['level 1','level2']) 
my_index1
Out[137]:
MultiIndex(levels=[['0 level', 'A level'], [21, 22, 23]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
           names=['level 1', 'level2'])

生成dataframe

np.random.randn(6,2) 6 rows 2cols

In [132]:
my_df = pd.DataFrame(np.random.randn(6,2),index=my_index,columns=['A','B'])
my_df
Out[132]:
A B
0 level 21 1.250386 0.674255
22 1.992482 0.261726
23 -1.817730 0.639695
A level 21 0.798868 -1.090282
22 0.316124 0.474781
23 1.005989 -1.171954
In [ ]:
 
In [138]:
my_df1 = pd.DataFrame(np.random.randn(6,2),index=my_index1,columns=['A','B'])
my_df1
Out[138]:
A B
level 1 level2
0 level 21 -1.265380 0.912149
22 -3.480369 0.854664
23 0.414174 -0.225250
A level 21 0.289880 0.465874
22 -0.165049 0.507552
23 -1.138782 -1.311785

2.5.2 获取多级索引中的数据

还是用到 .loc[] 。比如,先获取 '0 Level' 下的数据:

In [135]:
my_df.loc['0 level']
Out[135]:
A B
21 1.250386 0.674255
22 1.992482 0.261726
23 -1.817730 0.639695
In [136]:
my_df.loc['0 level'].loc[21,'A']
Out[136]:
1.250386319974997

2.5.3 my_df的索引没有名字怎么办 除了上面的在创建Multiindex就赋值 还有课已给DF的index命名字

In [139]:
my_df.index.names=['level 1', 'level 2']
In [140]:
my_df
Out[140]:
A B
level 1 level 2
0 level 21 1.250386 0.674255
22 1.992482 0.261726
23 -1.817730 0.639695
A level 21 0.798868 -1.090282
22 0.316124 0.474781
23 1.005989 -1.171954

2.5.4 交叉选择行和列中的数据

我们可以用 .xs() 方法轻松获取到多级索引中某些特定级别的数据。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.xs.html

比如,我们需要找到所有 level 1 中,level 2 = 22 的行:

In [141]:
my_df.xs(22, level='level 2')
Out[141]:
A B
level 1
0 level 1.992482 0.261726
A level 0.316124 0.474781
In [145]:
my_df.xs(('A level',23))
Out[145]:
A    1.005989
B   -1.171954
Name: (A level, 23), dtype: float64
In [146]:
type(my_df.xs(('A level',23)))
Out[146]:
pandas.core.series.Series
In [147]:
type(my_df.xs(22, level='level 2'))
Out[147]:
pandas.core.frame.DataFrame
In [149]:
my_df.xs('A',axis=1)
Out[149]:
level 1  level 2
0 level  21         1.250386
         22         1.992482
         23        -1.817730
A level  21         0.798868
         22         0.316124
         23         1.005989
Name: A, dtype: float64
In [151]:
first=['0 level','0 level', '0 level', 'A level', 'A level', 'A level']
second=['one','two','three','one','one','two']
third=[21,22,23,21,22,23]
my_multiindex1=list(zip(first,second,third))
my_multiindex1=pd.MultiIndex.from_tuples(my_multiindex1, names=['first','second','third']) 
my_multiindex1
Out[151]:
MultiIndex(levels=[['0 level', 'A level'], ['one', 'three', 'two'], [21, 22, 23]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 2, 1, 0, 0, 2], [0, 1, 2, 0, 1, 2]],
           names=['first', 'second', 'third'])
In [153]:
my_multiindex_df=pd.DataFrame(np.random.randn(6,3),index=my_multiindex1,columns=['A','B','C'])
my_multiindex_df
Out[153]:
A B C
first second third
0 level one 21 0.574611 0.155226 -0.117590
two 22 -0.953444 -0.413098 -0.389587
three 23 -0.635277 -0.053351 0.646826
A level one 21 -0.094131 -0.181270 0.036785
22 0.011917 -2.218099 0.635074
two 23 -0.455450 1.320048 1.083327
In [156]:
my_multiindex_df.xs(('0 level', 'three'))
Out[156]:
A B C
third
23 -0.635277 -0.053351 0.646826
In [158]:
my_multiindex_df.xs(('0 level', 23), level=['first','third'])
Out[158]:
A B C
second
three -0.635277 -0.053351 0.646826
In [159]:
my_multiindex_df.xs('one', level='second',)
Out[159]:
A B C
first third
0 level 21 0.574611 0.155226 -0.117590
A level 21 -0.094131 -0.181270 0.036785
22 0.011917 -2.218099 0.635074

2.6 清晰数据

2.6.1 删除或填充空值

在许多情况下,如果你用 Pandas 来读取大量数据,往往会发现原始数据中会存在不完整的地方。在 DataFrame 中缺少数据的位置, Pandas 会自动填入一个空值,比如 NaN或 Null 。因此,我们可以选择用

  • .dropna() 来丢弃这些自动填充的值,或是用
  • .fillna() 来自动给这些空值填充数据。
In [161]:
df_with_NAN={'A':[1, np.nan,2],'B':[np.nan,np.nan,3],'C':[1,4,5]}
df_with_NAN=pd.DataFrame(df_with_NAN)
df_with_NAN
Out[161]:
A B C
0 1.0 NaN 1
1 NaN NaN 4
2 2.0 3.0 5

2.6.1.1 .dropna()

当你使用 .dropna() 方法时,就是告诉 Pandas 删除掉存在一个或多个空值的行(或者列)。删除列用的是 .dropna(axis=0) ,删除行用的是 .dropna(axis=1) 。

如果你没有指定 axis 参数,默认是删除行。

In [162]:
df_with_NAN.dropna()
Out[162]:
A B C
2 2.0 3.0 5
In [163]:
df_with_NAN
Out[163]:
A B C
0 1.0 NaN 1
1 NaN NaN 4
2 2.0 3.0 5
In [164]:
df_with_NAN.dropna(axis=1)
Out[164]:
C
0 1
1 4
2 5
In [165]:
df_with_NAN
Out[165]:
A B C
0 1.0 NaN 1
1 NaN NaN 4
2 2.0 3.0 5

2.6.1.2 .fillna()

类似的,如果你使用 .fillna() 方法,Pandas 将对这个 DataFrame 里所有的空值位置填上你指定的默认值。比如,将表中所有NaN 替换成 1

In [166]:
df_with_NAN.fillna(1)
Out[166]:
A B C
0 1.0 1.0 1
1 1.0 1.0 4
2 2.0 3.0 5
In [169]:
df_with_NAN
Out[169]:
A B C
0 1.0 NaN 1
1 NaN NaN 4
2 2.0 3.0 5

选择性填充:

我们可以选择只对某些特定的行或者列进行填充。比如只对 'A' 列进行操作,在空值处填入该列的平均值:

In [167]:
df_with_NAN['A'].fillna(df_with_NAN['A'].mean())
Out[167]:
0    1.0
1    1.5
2    2.0
Name: A, dtype: float64
In [168]:
df_with_NAN
Out[168]:
A B C
0 1.0 NaN 1
1 NaN NaN 4
2 2.0 3.0 5

同理,.dropna() 和 .fillna() 并不会永久性改变你的数据,除非你传入了inplace=True 参数。

In [ ]: