pandas学习笔记
pandas处理丢失数据
当某一行有nan即丢失的数据时,可以选择把某一行或列丢掉
df.dropna(axis=0,how=‘any’) #axis=1代表列,0代表行,how可以等于any或者all,等于any表示行/列中有一个nan就删掉,all表示行/列中全部为nan才能删掉
不想丢掉就可以填上
df.fillna(value=0) #value为你想填的值
查看你的数据是否有缺失可以用
df.isnull()对每个数据进行判断,返回一个元素为true或false的矩阵,nan的元素返回true,其余返回false
如果觉得矩阵太多太大可以使用np.any(df.isnull())==True
pandas数据的存取
1.pickle
pickle模块:不能在excel中显示
把 Python 对象直接保存到文件里,而不需要先把它们转化为字符串再保存,也不需要用底层的文件访问操作,直接把它们写入到一个二进制文件里。pickle 模块会创建一个 Python 语言专用的二进制格式,不需要使用者考虑任何文件细节,它会帮你完成读写对象操作。用pickle比你打开文件、转换数据格式并写入这样的操作要节省不少代码行。包括loads方法和dumps方法
2.csv格式
csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中。 此文件,一行即为数据表的一行。生成数据表字段用半角逗号隔开。csv文件用记事本和excel都能打开,用记事本打开显示逗号,用excel打开没有逗号了。
读取csv文件就可以直接用data=read_csv(‘文件名’)
存储就是data.to_pickle(‘文件名’)
还有很多种方式以及各式如下图所示
pandas合并dataframe,concatenating
先创建三个dataframe
df1=pandas.DataFrame(np.ones((3,4))*0,columns=[‘a’,‘b’,‘c’,‘d’])
df2=pandas.DataFrame(np.ones((3,4))*1,columns=[‘a’,‘b’,‘c’,‘d’])
df3=pandas.DataFrame(np.ones((3,4))*2,columns=[‘a’,‘b’,‘c’,‘d’])
纵向合并axis=0,横向合并axis=1
res=pd.concat([df1,df2,df3])
想更新索引就增加一个参数
res=pd.concat([df1,df2,df3],axis=0,ignore_index=True)
join
类似于数据库原理,join就是连接
当两个dataframe的行和列的索引不同时,可以使用join,如果使用concat参数默认会出现nan,此时join参数默认值为outer,如下图所示:
df1=pandas.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3])
df2=pandas.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'],index=[2,3,4])
res=pd.concat([df1,df2])
print(res)
inner就是内联结,只保留相同部分,如下图所示:
res=pd.concat([df1,df2],join='inner')
下一种方式,类似于左/右联结
res=pd.concat([df1,df2],join_axes=[df1.index]) #现在这种方式已经不存在了
下一种方式 append
在纵向或者横向为一个dataframe加上另一个dataframe,axis=0纵向,axis=1横向
res=df1.append(df2)
也可以加多个df1.append([df2,df3])
pandas的merge合并
对于key或者index进行合并
先为dataframe设置key,在key处合并
df1=pandas.DataFrame({'key':['K0','K1','K2','K3'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']})
df2=pandas.DataFrame({'key':['K0','K1','K2','K3'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']})
print(df1)
print(df2)
res=pd.merge(df1,df2,on='key')
print(res)
两个key分别是key1,key2,对于这两个公共列进行合并,默认为inner,即保留相同一行
df1=pandas.DataFrame({'key1':['K0','K1','K1','K0'],'key2':['K0','K1','K2','K2'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']})
df2=pandas.DataFrame({'key1':['K0','K0','K1','K1'],'key2':['K2','K1','K2','K0'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']})
print(df1)
print(df2)
res=pd.merge(df1,df2,on=['key1','key2'])
print(res)
默认how=’inner’
若how=‘outer’
res=pd.merge(df1,df2,on=['key1','key2'],how='outer')
res=pd.merge(df1,df2,notallow=[‘key1’,‘key2’],how=‘right’)
res=pd.merge(df1,df2,notallow=[‘key1’,‘key2’],how=‘left’)
当加上参数indicator时就会有一列显示连接方式
也可以给indicator那一列的索引改名字 indicator=‘新名字’
merge的另一种合并方式:index,写法类似,只不过把key换成了索引
df1=pandas.DataFrame({'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']},index=['K0','K1','K2','K3'])
df2=pandas.DataFrame({'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']},index=['K0','K2','K3','K4'])
#注意index要放在后面
print(df1)
print(df2)
res=pd.merge(df1,df2,left_index=True,right_index=True,how='outer')
print(res)
当两个dataframe的某一属性是相同的但是又想在合并之后加以区分时可以在参数中加入suffixes=[‘后缀一’,‘后缀二’]
pandas的可视化
data = pd.Series(np.random.randn(1000), index=np.arange(1000))#生成线性的1000个数据
data = data.cumsum()#生成的100个数据累加
data.plot()
plt.show()#打印结果
DataFrame.plot( )函数用于画图,默认为折线图
DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False,
sharex=None, sharey=False, layout=None,figsize=None,
use_index=True, title=None, grid=None, legend=True,
style=None, logx=False, logy=False, loglog=False,
xticks=None, yticks=None, xlim=None, ylim=None, rot=None,
xerr=None,secondary_y=False, sort_columns=False, **kwds)
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))#生成一个具有4个属性的100个数据的dataframe
data = data.cumsum()#累加
data.plot()
plt.show()
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))#生成一个具有4个属性的100个数据的dataframe
data = data.cumsum()#累加
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label="Class 1")#只有x和y两个属性
data.plot.scatter(x='A', y='C', color='LightGreen', label='Class 2', ax=ax)#把这个附在之前的ax上,scatter只能针对dataframe数据
plt.show()
结果如下: