pandas小记:pandas数据规整化-缺失和冗余数据处理

时间:2022-12-20 21:58:51

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

[Missing Data section]

皮皮Blog



冗余数据处理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]

皮皮blog

from:http://blog.csdn.net/pipisorry/article/details/39482861

ref: [Working with missing data]