Pandas 数据处理
常规数据处理:
- 数据类型转换
- df.A.astype str,int, float,long
- 百分比 map(lambda s:'{0:.2f}%'.format(s*100))
- 四舍五入,精度控制
- 时间类 map
- string->date pd.to_datetime(s).date()
- 重命名列名 df.rename(columns= xx ,inplace=True)
-
排序 df.sort_values(by=['xx','yy'])
- 删除列 df.drop('xx',axis=1)
- 增加列
- df['B']=xxx
- df['B']=df['A'].apply( )
- df['C']=df[['A', 'B']].apply(lambda x: '_'.join(str(value) for value in x), axis=1) C=A_B
- 拆分列
- 拆json pd.concat([dt.drop('response_data',axis=1), pd.DataFrame(dt['response_data'].apply(lambda t:eval(t)).to_dict()).T], axis=1)
- 填充缺失值 df.fillna(0,inplace=True)
- 列名重排序
- 替换值 vals_to_replace = {'Small':'1', 'Medium':'5', 'High':'15'}
- df.replace( { 'A' :vals_to_replace } ) 替换多个列数据
- df.A=df.A.map(vals_to_replace )
- df.A.replace(vals_to_replace , inplace=True)
- df.A.update(pd.Series(vals_to_replace ))
- 去重 df.dropna()
过滤数据:
- df[ df['A']=='xx' ] 可以 =、>、 <、
- df [ df['A'].isin( [a,b,c ] ) ] , df [~ df['A'].isin( [a,b,c ] ) ] 为取反
- df.query(' xx<A<yy ')
- df.str.contains 或 df['A'].str.contains
- pattern=u'xxyy|zz df['A'].str.contains(pattern)== False/True
- 正则表达式 regex
- 以上过滤条件均可以组合, 用 df[ ( df['A']=='xx' ) | ( df['B'].isin([a,b,c]) & df['C'].contains() ], & 和 | ; 多个条件需要单独加
赋值: ix, iloc
- df.loc[df[' A '] > a, 'A'] = 1
-
df.ix[ df.B.isin(['X','Y','Z']), 'A'] = 'T'
数据分组、切分、拼接
1 .拼接
- 左右 merge pd.merge(df1,df2,on='A', how=‘left’) 或者 df1.merge(df2,on='A', how='left' )
- index也可以merge , pd.merge(df1,df2,left_index=True,right_index=True)
- 上下 append df1.append(df2)
- 左右 merge pd.merge(df1,df2,on='A', how=‘left’) 或者 df1.merge(df2,on='A', how='left' )
- 切分
- cut
- pd.cut([1,10],10,right=True) 10等分
-
bins=[0,50,100,200,500,1000,3000]cats=pd.cut(df['A'],bins) ,产生一个cat 新列
- qcut
- cut
- 分组 groupby
- s.groupby('A').filter(lambda s:len(s)>10)['A']
- s.groupby('A').filter(lambda s:len(s)>10)['A'].value_counts() 出现10次以上的计数
- s.groupby('A').filter(lambda s:s['A'].count>10)['A'].value_counts() 出现10次以上的计数
4. 透视表 pivot_table
Python数据类型 dict ,list ,tuple, dataframe ,json , str
- list of dict ,dict里面的元素是list df=pd.Dataframe( dict )
- sql in str(tuple(list))
- json =json_loads(str) str->json
- df=json_normalize(json) json->dateframe 只有一行的dataframe
数据描述
- size df[ df['A'] ==xx'].size()
- value_counts
- 后面可以接order
- max,min ,count
- info() ,describe()
pandas 与 excel 交互
- 读取 pd.read_excel( file_path )
- 如果不想把某列字符转成数字 converters={'A': str} , 多见于身份证号,合同编号等等
- sheet_name=' sheet名称' ,sheetname= 0,1,2 编号 。不指定默认第1个sheetname
- xls=pd.ExcelFile( file_path )
- xls.sheet_names
- xls.parse(xls.sheet_names[i] )
- 保存 pd.to_excel( file_path, index=False, encoding='utf-8')
- xls=pd.ExcelWriter( file_path, encoding='utf-8', engine='openpyxl')
- 和3结合能将多个sheet写至一个xls
df.to_excel(xls, sheet_name='xx',index=False)
xls.save() - encoding 编码,否则中文保存可能报错
- 和3结合能将多个sheet写至一个xls
pandas 与 csv 交互
- 读取 pd.read_csv()
- 保存 df.to_csv(columns=['A', 'B', 'C'], sep='\t', index=False) 指定列,分隔符
pandas 与 sql 交互
from sqlalchemy import create_engine
- 读取 pd.read_sql(sql, engine)
- 保存 pd.to_sql (name=, engine, if_exists='append' ,chunksize=10000,index=False)
- if_exists
- fail: If table exists, do nothing.
- replace: If table exists, drop it, recreate it, and insert data.
- append: If table exists, insert data. Create if does not exist
- index_col : column=>index , index_label: index=>column
- index=True/False ,默认是False
- dtype={'date': datetime.date} ,engine 必须是 sqlalchemy ,不能是MySQLdb
- if_exists
- 自定义插入
- sql_update = """
update tabel set A= %s where B= %s;
"""
engine.execute(sql_update,df[['A','B']].values.tolist() )
- sql_update = """