http://blog.csdn.net/pipisorry/article/details/39482861
处理缺失数据
缺失数据(missing data)在大部分数据分析应用中都很常见。pandas的设计目标之一就是让缺失数据的处理任务尽量轻松,pandas对象上的所有描述统计都排除了缺失数据。
pandas使用浮点NaN (Not a Number)表示浮点和非浮点数组中的缺失数据,它只是一个便于被检测出来的标记而已。pandas primarily uses the value np.nan to represent missing data. It is bydefault not included in computations.
NA处理方法
方法 说明
dropna 根据各标签的中是否存在缺失数据对轴标签进行过滤,可通过阈调节对缺失的容忍度
fillna 用指定或插方法(如ffill或bfill)填充缺失数据
isnull 返回一个含有布尔的对象,这些布尔表示哪些是缺失/NA,该对象的类型与源类型一样
notnull isnull 的否定式
>>>string_data=Series(['aardvark','artichoke',np.nan,'avocado'])
>>> string_data
0 aardvark
1 artichoke
2 NaN
3 avocado
dtype: object
isnull()
>>> string_data.isnull()
0 False
1 False
2 True
3 False
dtype: bool
Python内置的None也会被当做NA处理
Note:使用pd函数可以直接对str类型或者float类型的nan判断是否是pandas的nan类型:pd.isnull(df1)。
滤除缺失数据dropna
过滤掉缺失数据的办法有很多种,纯手工操作永远都是一个办法,但dropna可能会更实用一些。
对于Series,dropna返回一个仅含非空数据和索引的Series:
>>> from numpy import nan as NA
>>>data = Series([1, NA, 3.5, NA, 7])
>>>data.dropna()
0 1.0
2 3.5
4 7.0
dtype: float64
当然,也可以通过布尔型索引达到这个目的data[data.notnull()]
对于DataFrame对象,dropna默认丢弃任何含有缺失的行:
>>>data = pd.DataFrame([[1., 6.5, 3.],[1., NA,NA],[NA, NA, NA], [NA, 6.5, 3.1]])
>>>data.dropna()
0 1 2
0 1.0 6.5 3.0
传入how='all'将只丢弃全为NA的那些行:
>>>data.dropna(how='all')
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.1
To drop any rows that have missing data: df1.dropna(how='any')
丢弃列axis=1
>>>data[4] = NA
>>>data
>>>data.dropna(axis=1, how='all‘)
只留下一部分观测数据thresh参数
另一个滤除DataFrame行的问题涉及时间序列数据。假设只想留下一部分观测数据, 可以用thresh参数实现此目的(至少要有thresh个非NA值?):
>>>df = df.DataFrame(np.random.randn(7, 3))
>>>df.ix[:4, 1] = NA; df.ix[:2, 2] = NA
>>>df
0 1 2
0 -0.776521 NaN NaN
1 -1.179873 NaN NaN
2 -0.479620 NaN NaN
3 -0.214146 NaN -0.387709
4 0.864021 NaN -1.198854
5 -1.654861 -1.367580 -1.010236
6 0.454499 0.938988 -0.511850
>>>df.dropna(thresh=3)
0 1 2
5 -1.654861 -1.367580 -1.010236
6 0.454499 0.938988 -0.511850
填充缺失数据fillna
若不想滤除缺失数据(有可能会丢弃跟它有关的其他数据),而是希望通过其他方式填补那些“空洞”。对于大多数情况而言,fillna方法是最主要的函数。
fillna函数的参数
value 用于填充缺失的标量或字典对象
method 插方式。如果函数调用时未指定其他参数的话,默认为“ffill”
axis 待填充的轴,默认axis=0
inplace 修改调用者对象而不产生副本
limit (对于前向和后向填充)可以连续填充的最大数量
通过一个常数调用fillna就会将缺失替换为那个常数:
>>> df.fillna(0)
若是通过一个字典调用fillna,就可以实现对不同的列填充不同的
>>> df.fillna({1: 0.5, 3: -1})
fillna默认会返回新对象,但也可以对现有对象进行就地修改:
#总是返回被填允对象的引用
>>> _ = df.fillna(0, inplace=True)
对reindex有效的那些插方法也可用于fillna:
>>> df = DataFrame(np.random.randn(6, 3))
>>>df.ix[2:,1] = NA; df.ix[4:,2] = NA
>>>df.fillna(method='ffill')
>>>df.fillna(method='ffill', limit=2)
传入Series 的平均或中位数:
>>>data = Series([1., NA, 3.5, NA, 7])
>>>data.fillna(data.mean())
0 1.000000
1 3.833333
2 3.500000
3 3.833333
4 7.000000
dtype: float64
冗余数据处理Duplicate Data
DataFrame的duplicated方法返回一个布尔型Series,表示各行是否重复行。而 drop_duplicates方法,它用于返回一个移除了重复行的DataFrame
data.drop_duplicates(inplace=True) 或者data = data.drop_duplicates()
只对某一列有重复则删除:
df.drop_duplicates(subset=0, inplace=True)[ API : pandas.DataFrame.drop_duplicates]
[ Duplicate Data]
from:http://blog.csdn.net/pipisorry/article/details/39482861
ref: [Working with missing data]