今天介绍Pandas对一些常见数据的处理方法。
1 | import numpy as np |
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 | df[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|s')#查看以A为开头,s为结尾的序列 |
1 | ts.str.count('[A|s]')#查看以A为开头,s为结尾的序列数量 |
1 | ts.str.find('de')#从左往右寻找'de',匹配返回位置索引,未找到返回'-1' |
1 | ts.str.rfind('de')#从右往左寻找 |
1 | ts.str.replace('\s?', 'LA', regex=True)#使用正则进行字符串替换 |
1 | pat = '(\w+o)(\w+s)(\w+u)(\w+n)' |
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 | res = df.psavert <= 'S4'#比较顺序 |
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 | #dt对象 |
1 | pd.Timestamp('20210223 22:00:00')-pd.Timestamp('20210222 18:35:00')#计算两个时间之差 |