简介
本文将介绍pandas的几个实用操作——去重、替换和重命名索引。
去除重复数据
在DataFrame中经常会碰到重复行数据,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>>import numpy as np >>>import pandas as pd >>>a = pd.DataFrame({'n1': list('aaabbbb'), 'n2': [1, 1, 2, 3, 3, 4, 4]}) >>>a n1 n2 0 a 1 1 a 1 2 a 2 3 b 3 4 b 3 5 b 4 6 b 4 |
使用duplicated()
方法能够返回一个布尔型Series:
1 2 3 4 5 6 7 8 9 |
>>>a.duplicated() 0 False 1 True 2 False 3 False 4 True 5 False 6 True dtype: bool |
默认是对所有列进行重复判断,False
表示不重复,True
表示重复。如果要去除重复行可以使用drop_duplicates()
方法:
1 2 3 4 5 6 |
>>>a.drop_duplicates() n1 n2 0 a 1 2 a 2 3 b 3 5 b 4 |
可以看出不加任何参数的话,是对所有列进行重复判断,也可以指定判断的列:
1 2 3 4 |
>>>a.drop_duplicates('n1') n1 n2 0 a 1 3 b 3 |
这里根据'n1'
列进行重复判断,只保留了第一个出现的不重复的值。我们也可以通过keep
参数控制重复值:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 保留最后一个重复值 >>>a.drop_duplicates(keep='last') n1 n2 1 a 1 2 a 2 4 b 3 6 b 4 # 不保留重复值 >>>a.drop_duplicates(keep=False) n1 n2 2 a 2 |
替换数据
在前面我们已经介绍了缺失值的替换,这里介绍通过replace()
方法进行更普遍的替换。
假设有一个数据:
1 2 3 4 5 6 7 8 |
>>>a1 = pd.Series([3, 4, np.nan, 5, 7]) >>>a1 0 3.0 1 4.0 2 NaN 3 5.0 4 7.0 dtype: float64 |
我们想要替换缺失值,可以这样处理:
1 2 3 4 5 6 7 |
>>>a1.replace(np.nan, 6) 0 3.0 1 4.0 2 6.0 3 5.0 4 7.0 dtype: float64 |
只需要传入待替换值和替换值,我们也可以一次性替换多个数据:
1 2 3 4 5 6 7 |
>>>a1.replace([np.nan, 5, 7], 10) 0 3.0 1 4.0 2 10.0 3 10.0 4 10.0 dtype: float64 |
如果针对不同的值替换不同的值有两种方式可以实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 传入列表 >>>a1.replace([np.nan, 5, 7], [10, 100, 100]) 0 3.0 1 4.0 2 10.0 3 100.0 4 100.0 dtype: float64 # 传入字典 >>>a1.replace({np.nan: 10, 5: 100, 7: 100}) 0 3.0 1 4.0 2 10.0 3 100.0 4 100.0 dtype: float64 |
在DataFrame中使用的方式相同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
>>>a2 = pd.concat([a1, a1], axis=1) 0 1 0 3.0 3.0 1 4.0 4.0 2 NaN NaN 3 5.0 5.0 4 7.0 7.0 >>>a2.replace(np.nan, 20) 0 1 0 3.0 3.0 1 4.0 4.0 2 20.0 20.0 3 5.0 5.0 4 7.0 7.0 >>>a2[0].replace(np.nan, 5, inplace=True) >>>a2 0 1 0 3.0 3.0 1 4.0 4.0 2 5.0 NaN 3 5.0 5.0 4 7.0 7.0 |
可以替换DataFrame中的数据,或者替换指定列中的数据,使用inplace
参数可以对原数据对象进行修改。
重命名索引
首先介绍set_axis()
方法重命名索引,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>>a1 0 3.0 1 4.0 2 NaN 3 5.0 4 7.0 dtype: float64 >>>a1.set_axis(list('abcde'), inplace=True) >>a1 a 3.0 b 4.0 c NaN d 5.0 e 7.0 dtype: float64 |
可见这种方式是对原数据对象进行修改,在DataFrame中也是如此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>>a2 0 1 0 3.0 3.0 1 4.0 4.0 2 5.0 NaN 3 5.0 5.0 4 7.0 7.0 >>>a2.set_axis(list('abcde'), inplace=True) 0 1 a 3.0 3.0 b 4.0 4.0 c 5.0 NaN d 5.0 5.0 e 7.0 7.0 |
set_axis()
方法是强制修改原数据对象,使用起来不够灵活。接下来要讲更适用的方法rename()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
>>>a2 0 1 a 3.0 3.0 b 4.0 4.0 c 5.0 NaN d 5.0 5.0 e 7.0 7.0 >>>a2.rename(index={'a': 0, 'c': 2}, columns={0: 'one'}) one 1 0 3.0 3.0 b 4.0 4.0 2 5.0 NaN d 5.0 5.0 e 7.0 7.0 >>>a2 0 1 a 3.0 3.0 b 4.0 4.0 c 5.0 NaN d 5.0 5.0 e 7.0 7.0 |
可以看出rename()
方法可以传入一个字典,指定修改的轴索引。而且这个方法也有inplace
参数可以决定是否修改原数据对象:
1 2 3 4 5 6 7 8 |
>>>a2.rename(index={'a': 0, 'c': 2}, columns={0: 'one'}, inplace=True) >>>a2 one 1 0 3.0 3.0 b 4.0 4.0 2 5.0 NaN d 5.0 5.0 e 7.0 7.0 |
总结
本文介绍了pandas数据处理中的去重、替换和重命名索引操作。记住一点:操作的方法有很多,关键是要掌握不同方法的优劣,用适合自己的方式去处理数据。