pandas小记:pandas数据规整化-缺失、冗余、替换

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']

[pandas教程:[26]值替换]

 

 

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)。

滤除缺失数据dropna

DataFrame.dropna(axis=0how='any'thresh=Nonesubset=Noneinplace=False)

对于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

dropna默认丢弃任何含有缺失的行how='any':
>>>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

subset参数:

指定只有subset中的列存在nan才丢弃行。如只删除case_id列存在nan的行:data_df = data_df.dropna(subset=['case_id'])

axis参数:

丢弃列而不是行:axis=1

thresh参数:

只留下 至少有thresh个 非NA值的观测数据。
>>>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

dropna有一个缺陷就是不能指定什么值算是na的,这个只能在读取数据时指定,如pandas.read_excel中的参数na_values。

填充缺失数据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]

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页