今天介绍Pandas对一些常见数据的处理方法。

1 2 3 import numpy as np import pandas as pd df = pd.read_csv('./economics.csv')

1.缺失数据处理

1 df.isna()#是否有缺失值
1 df.isna().mean()#缺失的比例
1 df[df.psavert.isna()]#查看某列是否有缺失值
1 df[df[['psavert','pop','uempmed']].isna().any(1)]#查看所有列至少有一个缺失值的行“any()至少有一个为空,all()都为空”
1 2 df[df[['psavert','pop','uempmed']].notna().all(1)]#查看所有没有缺失值的行 df.loc[df[['psavert','pop','uempmed']].notna().all(1)]#查看所有没有缺失值的区域
1 df.dropna(axis = 0, how = 'any', subset = ['psavert', 'pop'])#axis=0(删除)行,how='any'至少有一个缺失的行
1 df.dropna(axis = 1, thresh = df.shape[0]-5)#删除超过5个缺失值的列
1 df.fillna(method = 'ffill', limit = 1)#method='ffill'用前面的元素填充/method='bfill'用后面的元素填充,limit=1连续缺失值的最大填充次数为1
1 df.fillna(df.mean())#用每列的均值填充

1 df.interpolate(limit_direction='both', limit=1)#用线性插值填充(both为双向限制插值)
1 df.interpolate('nearest').values#用最近邻插值填充

此外,也可以使用KNN来填充缺失值

2.文本数据处理

1 ts = pd.Series(df['Area'].values, index=df['pct_2014'])#DataFrame转换为Series
1 ts.str[0]#查看第一个字符
1 ts.str.len()#查看字符长度
1 ts.str.split('[aon]', n=3, expand=True)#从左到右拆分字符串,最大拆分次数3次,生成多列
1 ts.str.join('-')#每个字符用“-”连接
1 ts.str.cat(ts2, sep='-')#合并两个字符Series,连接符为“-”
1 ts.str.contains('[a-z]u')#查看包含正则模式的序列
1 ts.str.startswith('A')#查看以A为开始的序列
1 ts.str.endswith('e')#查看以e为结尾的序列
1 ``` ts.str.match(‘A
1 ``` ts.str.count(‘[A
1 ts.str.find('de')#从左往右寻找'de',匹配返回位置索引,未找到返回'-1'
1 ts.str.rfind('de')#从右往左寻找
1 ts.str.replace('\s?', 'LA', regex=True)#使用正则进行字符串替换
1 2 pat = '(\w+o)(\w+s)(\w+u)(\w+n)' ts.str.extract(pat)#拆分'o','s','u','n'为4列

1 pd.to_numeric(ts, errors='ignore')#将可以转为数值的字符转为数值
1 ts.str.pad(6,'left','*')#选定字符串长度为6的填充为"*"
1 ts.str.lstrip()#去掉字符串左侧空格
1 ts.str.zfill(8)#用0补足8位

3.分类数据

1 s = df.psavert.astype('category')#Dataframe转为category对象
1 s.cat.categories#查看分类对象属性
1 s.cat.add_categories('C1')#增加一个类别
1 s.cat.remove_categories(11.7)#删除一个类别
1 s = s.cat.rename_categories({'S1':'xxx'})#重命名类别及其值
1 s.cat.reorder_categories(['S1', 'S2', 'S3', 'S4'], ordered=True)#设置排序
1 df.sort_values('psavert')#值排序
1 df.set_index('psavert').sort_index()#作为索引排序
1 2 res = df.psavert <= 'S4'#比较顺序 res

4.时序数据

————-图——————–

1 s = pd.to_datetime(df.date)#生成时间序列
1 s2 = pd.to_datetime(['2020\\1\\1','2020\\1\\3'],format='%Y\\%m\\%d')#强制格式转换,生成时间序列
1 pd.date_range('1967-07-01','2015-04-01', freq='D')#查看两个时间之间的时间,间隔1天

1 2 3 4 #dt对象 s.dt.daysinmonth#每个月几天 s.dt.dayofweek#每周几天 s.dt.dayofweek.isin([5,6])#是否包含双休日
1 pd.Timestamp('20210223 22:00:00')-pd.Timestamp('20210222 18:35:00')#计算两个时间之差