http://blog.csdn.net/pipisorry/article/details/39482861
处理缺失数据
缺失数据(missing data)在大部分数据分析应用中都很常见。pandas的设计目标之一就是让缺失数据的处理任务尽量轻松,pandas对象上的所有描述统计都排除了缺失数据。
在dataframe中为np.nan或者pd.naT(缺失时间),在series中为none或者nan即可。pandas使用浮点NaN (Not a Number)表示浮点和非浮点数组中的缺失数据,它只是一个便于被检测出来的标记而已。pandas primarily uses the value np.nan to represent missing data. It is bydefault not included in computations.
数据替换
DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
参数
1 to_replace : str, regex, list, dict, Series, numeric, or None
dict: Nested dictionaries, e.g., {‘a’: {‘b’: nan}}, are read asfollows: look in column ‘a’ for the value ‘b’ and replace itwith nan. You can nest regular expressions as well. Note thatcolumn names (the top-level dictionary keys in a nesteddictionary) cannot be regular expressions. 嵌套的dict表示a列中的‘b'替换成nan。
2 如果需要改变原数据,需要添加常用参数 inplace=True
3 regex : bool or same types as to_replace, default False 替换的值是正则表达式
示例:
1 搜索整个DataFrame, 并将所有符合条件的元素全部替换
df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
2 用字典形式替换多个值
df.replace({'-99':np.nan, -99:np.nan, '':np.nan}) 或者列表形式的 df.replace(['C', 'F'], [0.999, 0.777])
字典里面的键‘C'和'F'就是原值,字典里的值0.999和0.777就是我们想要的新值。
如果替换的值都是一样的话就可以写简单点了:df.replace(['C', 'F'], 0.999)
3 使用正则表达式替换多个
使用正则表达式的时候记得后面加 regex=True参数。
df.replace('[a-z]', 0.99, regex=True)
4 只需要某个数据的部分内容
应该是只能针对str列进行。
df = pd.DataFrame([['10',20,30], ['40',50,60]], columns=['aa', 'bb', 'cc'])
aa bb cc
0 10 20 30
1 40 50 60
df['aa'] = df['aa'].str.replace('0', '1')
aa bb cc
0 11 20 30
1 41 50 60
TypeError: Cannot compare types 'ndarray(dtype=int64)' and 'str'
import pandas as pd
df = pd.DataFrame([[1, '-99', 2.3], [1.6, '22', -99]], dtype=pd.np.float64)
print("df:", df.dtypes)
code_dict = {'-99': 222, -99: 222}
# df = df.replace(code_dict)
# #TypeError: Cannot compare types 'ndarray(dtype=float64)' and 'str'
print("df:", df)
1 当df中只存在int64(或者float64)类型时,如果code_dict = {'-99':2, -99:2}中存在str类型的key就会报上面的错误。
2 当df中同时存在object(即str)类型和int64(或者float64)类型时(即将参数, dtype=pd.np.float64去掉),好像不会出错。
修复
code_dict = {'-99': 0, -99: 0, '': 0} #, np.nan: 0无效因为np.nan!=np.nan
df = df.applymap(lambda x: 0 if pd.isnull(x) else code_dict.get(x, x))
[pandas.DataFrame.replace][Python3 pandas(19) 替换 replace()及部分替换]
[Cannot compare types 'ndarray(dtype=int64)' and 'str']
NA处理方法
方法 说明
dropna 根据各标签的中是否存在缺失数据对轴标签进行过滤,可通过阈调节对缺失的容忍度
fillna 用指定或插方法(如ffill或bfill)填充缺失数据
isnull = isna 返回一个含有布尔的对象,这些布尔表示哪些是缺失/NA,该对象的类型与源类型一样
notnull = notna 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)。
判断dataframe中是否存在任何一个NAN
check_for_nan = df.isnull().values.any()
滤除缺失数据dropna
DataFrame.
dropna
(axis=0, how='any', thresh=None, subset=None, inplace=False)
dropna有一个缺陷就是不能指定什么值算是na的,这个只能在读取数据时指定,如pandas.read_excel中的参数na_values。
对于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对象
参数
how:how='any'默认,丢弃任何含有缺失的行;how='all'只丢弃全为NA的那些行
subset参数:指定只有subset中的列存在nan才丢弃行。如只删除case_id列存在nan的行:data_df = data_df.dropna(subset=['case_id'])
axis参数:丢弃列而不是行:axis=1
thresh参数:只留下 至少有thresh个 非NA值的观测数据。
>>>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
>>>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
>>>df = df.DataFrame(np.random.randn(7, 3))
>>>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
示例:在read_csv完了之后,dropna再fillna。
df = pd.read_csv(filename_in, ...)
df = df.dropna(how='any', subset=args.not_null_cols_any)
df = df.dropna(how='all', subset=args.not_null_cols_all)
df.fillna(value=0, inplace=True)
填充缺失数据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]