pandas 的一些不常用技巧
2019-01-05 本文已影响0人
徐卜灵
1、pandas 按列值排序
df.sort_values(by=['col_name1','col_name2'] , ascending=False)
按col_name1和col_name2 排序。排序方式降序。
2、 时间格式解析
from dateutil.parser import parse
a = parse('2018-01-02')
b = parse('20180304')
(b-a).days#days没有括号,426
很方便的解析,注意只能是字符串,而不能是int型
3、列合并pd.concat 和 pd.merge
# 使用concat合并时,index必须一致,否则会合并失败。
df1.reset_index(inplace=True,inplace=True)
df2.reset_index(inplace=True,inplace=True)
frames = [df1,df2]#
heng_concat = pd.concat(frames,axis = 1)#直接拼接到后面
shu_concat = pd.concat(frames,axis = 0)#竖着合并时,需要有相同的列名
default_concat = pd.concat(frames)#默认是竖着合并。
-----------------------------------------------------------
pd.merge(df1,df2,left_on='key1',right_on = 'key2')
有相同的列名是可以直接on = 'key'
pd.merge(df1,df2,on = 'key')
-----------------------------------------------------------
pd.merge(left, right, how='inner', on=None,
left_on=None, right_on=None,
left_index=False, right_index=False,
sort=False, suffixes=('_x','_y'), copy=True)
pd.concat(objs,axis=0,join='outer',
join_axes=None,ignore_index=False,keys=None,
levels=None,names=None,verigy_integrity=False)
- concat是直接把多张表拼接在一起,与merge作用很像,但是可以连接多张表;
- 与merge的差别在于,concat不会以某列作为主键来进行连接。
4、 在DataFrame中的指定位置插入一列
cols = df.columns.insert(0,'列名')#在第0列的位置增加一列
df.columns = df.reindex(columns = cols)#替换掉原来的列名
还可以这样:
col_name.insert(col_name.index('B')+1,'D') # 在 B 列后面插入D列
df = df.reindex(columns = cols)#替换掉原来的列名
注意:一定要用df.reindex()这个函数,而不能直接用df.columns = cols
其实就是利用列表的插入,来修改列名。
5、pandas修改列名
5.1、暴力修改
df.columns = ['A','B','C','D']#列名要与长度一致
5.2、利用rename修改
df.rename(columns = {df.columns[3]:A},inplace = True)#加上inplace选项 .将第4列的列名修改为A。
6、dataframe 缺失值填充
6.1 均、中、众值填充
df['A'].mean() #均值
df['B'].median()#中值
df['c'].mode()#众值
#众数还有一种填充方式
df['c'].fillna(df['c'].value_counts().index.tolist()[0],inplace = True)#以出现最多的那个值填充
6.2前一个值或后一个值填充
df.fillna(method = 'bfill')#或者method = 'pad'
df.fillna(method = 'ffill',inplace = True)#inpalce 改变元数据
7、去除重复值
drop_duplicates
(subset=None, keep='first', inplace=False)[source]
df['A'].drop_duplicates(keep = 'last',inplace = True)#列'A'去除重复值,保留最后一个值。keep = 'first'保留第一个值。
8、删除有Nan的行和列
df.dropna(axis = 0,how = 'any')#也是默认选项。只要有空值,行就被删除
df.dropna(axis = 0,how = 'all')#删除表中所有数据都为Nan的行。
----------------------------
df.dropna(axis = 1,how = 'all')#删除表中所有数据都为Nan的列。
df.dropna(axis = 1,how = 'any')#只要有空值,列就被删除
9、python中的空值:None
如果想设置某一列为空,可以用
df['kong'] = None #注意不是Null或Nan或nan或NaN
10、对某一列转换数据类型
df['A'] = df['A'].astype('str')#列A原来是int类型就可以转为str类型
11、对列内容进行拼接
df['A'].str.cat(df['B'])#就可以把列A和列B数据进行合并。注意要两类分为都为字符串类型
df['A'].str.cat(df['B'],sep='--')#两列间加个分隔符
df['A'].str.cat([df['B'],df['C']],sep = '--')#拼接多列
12、列内容的拆分
df['A'].str.split('-',expand = True)#以-切分
13、设置小数位数,四舍五入
转自https://www.jianshu.com/p/96be2f0162ef)
df['A'].round(decimals = 2)#保留2位
df['B'].map(lambda x:('%.2f')%x)#自定义
df['C'].map(lambda x:format(x,'.2%'))#百分数
df['D'].map(lambda x:format(x,','))#
14、apply() applymap() map()的应用
14.1 当想让方程作用在一维的向量上时,可以使用apply来完成,行列都可以
df['A'].apply(lambda x:'%.2f'%x)
14.2 如果想让方程作用于DataFrame中的每一个元素,可以使用
df[['A','B']].applymap(lambda x: "%.3f"%x))
14.3map()只要是作用将函数作用于一个Series的每一个元素,也就是说智能处理列数据,且返回值是object
df['A'].map(lambda x:format(x,'.2%'))
15.DataFrame重新建立索引
df.reset_index(drop = True)
16.DataFrame范围切片
# 整数切片
df['a'].isin(range(5,8)) #可以取到df中a列的5-8之间的值
# 字符串
df[df['b'].isin(['a','p'])]
# 浮点数