DataFrame踩坑整理(一)
不得不说,工作中几乎天天跟DataFrame打交道,真的很有总结和记住的必要,话不多说,直接上干货。输入以下语句前别忘记:
import pandas as pd
import numpy as np
1、读入文件:
df=pd.read_csv(path,names=[‘’,’’,’’]);
#读入文件用names,格式转换用columns;
2、list转dataframe :
df=pd.DataFrame(data,column=[‘a’, ’b’]) ;
Dataframe 转list :df.values.tolist();
某一列数据转list :list(df[‘a’]);
3、两个dataframe 取交集,也可用于删除重复项目
pd.merge(df1,df2);
#很好用,速度快。
4、两个dataframe取并集(合并):
pd.concat([df1,df2])
#括号里面一定要写中括号。
#两个表合并之后一定要reset_index,否则索引值不是按顺序的。
5、DataFrame数据形式转换 :
Df=pd.DataFrame(df,type=np.float);
6、删除空值 :
df.dropna(axis=0,how=’any’,inplace=True);
#how的取值是any或者all。
7、填补缺失值 :
df.fillna(0,inplace=True) ;
#不要忘了inplace=True,否则不会在原表上修改;
8、计算缺失值个数:
list(data[‘a’].isnull()).count(True);
9、数据替换 :
df[‘a’]=df[‘a’].replace(‘.’ , ’0’);
10、根据一列数据生成另一列数据(例如归一化):
dt=df.apply(lambda x:(x-np.min(x))/(np.max(x)-np.min(x)));
#apply+lamda这个语句还是好用的,例如给不同分值的人分等级,可以先做一个字典,直接映射到字典里面的值。
11、筛选数据 :
df[df[‘a’]!=1][‘a’,’b’,’c’];
#选择a这一列中不为1的数据;
12、数据筛选(按列) :
df.iloc[:, df.columns!=’flag’];
13、数据筛选(按值):
A_list=[0.1,0,2,0.3];
df[‘a’].isin(alist);
14、取第一行:
df.iloc[[1]] ;
#一定要写两个中括号;
15、元素定位 :
df.loc[0:3,[‘a’,’b’]] #loc需要写列名;
df.iloc[0:3,[0,1]];
16、删除某一列 :
del df[‘a’];
17、删除多列 :
df=df.drop([‘a’,’b’],axis=1);
18、抽样 :
df[features].sample(n=1000);
#但感觉这个不太好用,可以用np.random.choice;
19、展示重复值 :
df[df.duplicated(keep=’first’)];
#不加列名就是展示所有列;
20、删除重复值 :
df.drop_duplicates(keep=’first’,inplace=True);
#这一步做完也一定要reset_index;
21、数据排序 :
df.sort_values(‘a’,ascending=True,inplace=true);
22、插入新的一列 :
df[‘d’]=None;
#然后再用apply+lambda赋值;
23、某一列值分类计数 :
df[‘a’].value_counts() ;
#要画图的话直接在后面加.plot(kind=’bar’);
24、求分位数 :
df[‘a’].quantile(0.25);
25、数据保存成csv文件 :
df.to_csv(‘a.csv’,header=False,index=False);
#如果不写后面两个False,就会自动生成一列索引和一个表头;
26、删除一列(太粗暴,太直接,早被拷贝、实例变量搞烦,看着爽,抄一遍):
del df[‘a’];
27、重命名一个列的列名,不用修改全部列的名字
autoc=autoc.rename(columns={'借':'值'})
28、melt,骚年的骚操作。pivot的逆操作。excel中能搞死你。
id_vars:不需要被转换的列名。value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了。
pd.melt(df,id_vars=['col2'],value_vars=['col1'],var_name='hi',value_name='hello')
29、dataframe,读入时指定数据类型。string,是np.string_,string后面有一个小尾巴。
stockcodes=pd.read_csv("stockcode.txt",dtype={'网易代码':np.string_},index_col=False,dayfirst=True,sep='\t',encoding='utf_8_sig',quoting=3,error_bad_lines=False,header=0)
30.日期数据类型,浪费生命的玩意儿。
apple['Date']=pd.to_datetime(apple['Date'])
31.r,c=df.shape,不是r,c=df.shape()
正式开发的时候,应该是没有时间抱怨,接着处理下一个bug。
32.本行与上一行shift
d=[data['成交量']-data['成交量'].shift(-1)]
d[0][0]=0
d[0][len(d[0])-1]=0
data['diff1']=d[0]
print(d,data.shape)
print(data)
33.修改某一列的名称。很让人不爽的操作。unamed:0,这种情况可以设置该列为index,然后reset_index。得到一个列名index,然后就可以用rename修改。难道没有一个根据顺序号修改名称的功能吗?
cpi=pd.read_csv("./statedata/cpi.txt",sep='\t',header=0,index_col=0)
cpi=cpi.reset_index()
34.按行遍历,倒是很老实,加一个inter。pandas老要注意index的处理,表格一列,默认就是index不是更干净:
for index,row in code.iterrows():
35.很让人慌的参数。header=0,读取的时候有头,如果to_csv的时候加了就没头。的确自己的地盘不需要和别人说得太明白,否则怎么坑人。
36.列逆序,神一样的操作。
#时间逆序
e=e.iloc[:, ::-1]
(未完待续。。。)