import numpy as np
import pandas as pd
多级索引
数据集存在多个级别的索引标号是可能的,特别是在低维下处理高维数据时。
Series
obj=pd.Series(np.random.randn(9),
index=[['a','a','a','b','b','c','c','d','d']
,[1,2,3,1,3,1,2,2,3]])
obj
带有层级索引的Series可以转换成DataFrame,反之亦然:
obj.unstack()
obj.unstack().stack()
所以带层级索引的Series可看作是普通的DataFrame:
obj.loc['a',2]
-0.9042816958522675
obj.loc['b':'c',:]
DataFrame
frame=pd.DataFrame(np.arange(12).reshape((4,3)),
index=[['a','a','b','b'],
[1,2,1,2]],
columns=[['Ohio','Ohio','Colorado'],
['Green','Red','Green']])
frame
同样地,带层级索引数据的行列标签也可以有名字(不过可视化的时候容易看混淆):
frame.index.names=['key1','key2'] #行索引命名
frame.columns.names=['state','color'] #列索引名字
frame
frame.loc['a','Ohio']
多级索引下的数据查找方式存疑
索引的重排与排序
frame.swaplevel(0,1,axis=0) #交换行标签的级别
frame.swaplevel(0,1,axis=1) #交换列标签的级别
frame.sort_index(axis=0,level=1) #对第2级的行标签排序
frame.sort_index(axis=1,level=0) #对第1级的列标签排序
层级统计信息
frame.sum(axis=0,level=1) #以二级标签进行列求和
frame.sum(axis=1,level=0) #以一级标签进行行求和
数据转索引
set_index()方法可以将DataFrame中已有的列数据转换成行索引:
frame=pd.DataFrame({
'a':np.arange(5),
'b':np.random.randn(5),
'c':['one','one','one','two','two'],
'd':[0,1,2,0,1]
})
frame.set_index(['c','d']) #将'c','d'列的数据转换成行索引
reset_index()方法为逆操作:
frame.set_index(['c','d']).reset_index()
数据集的合并
以列值为参照的水平拼接
df1=pd.DataFrame({
'key1':['b','c','a'],
'data1':np.arange(3)
})
df2=pd.DataFrame({
'key2':['a','d'],
'data2':np.arange(2)
})
#在两数据集中取'key'列的交集进行合并,共同的key值为'a','b'
pd.merge(df1,df2,left_on='key1',right_on='key2',how='inner')
#在两数据集中取'key'列的并集进行合并,并集的key值为'a','b','c','d'
pd.merge(df1,df2,left_on='key1',right_on='key2',how='outer')
#以左边数据集的'key1'值为参照进行合并
pd.merge(df1,df2,left_on='key1',right_on='key2',how='left')
#以右边数据集的'key2'值为参照进行合并
pd.merge(df1,df2,left_on='key1',right_on='key2',how='right')
当两数据集需要合并的参照列有同样的列索引名称时,可以进行更方便的合并:
df1=pd.DataFrame({
'key':['b','c','a'],
'data1':np.arange(3)
})
df2=pd.DataFrame({
'key':['a','d'],
'data2':np.arange(2)
})
pd.merge(df1,df2,on='key',how='inner')
注意以上两数据集中的参照列’key’都只有一个值,df1只有一个’a’,’b’,’c’,df2也只有一个’a’,’d’,这种情况下的合并可以产生一一映射,如果两数据集的参照列具有多个公共值,合并时的映射关系稍微复杂一点:
df1=pd.DataFrame({
'key':['b','b','c','c'],
'data1':np.arange(4)
})
df2=pd.DataFrame({
'key':['a','a','b','b'],
'data2':np.arange(4)
})
pd.merge(df1,df2,on='key',how='inner')
上述合并方法产生了4行数据,因为df1的’key’中有2个’b’,df2的’key’中也有2个’b’,且值均不相等,所以在合并时以全映射法则产生了4条数据。
当合并的参照列为多列时,直接传递一个列表即可:
df1=pd.DataFrame({
'key1':['foo','foo','bar'],
'key2':['one','two','three'],
'data1':np.arange(3)
})
df2=pd.DataFrame({
'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],
'data2':np.arange(4,8)
})
pd.merge(df1,df2,on=['key1','key2'],how='outer')
以行索引为参照的水平拼接
df1=pd.DataFrame(
np.arange(6).reshape((3,2)),
index=['a','c','e'],
columns=['Missouri','Alabama']
)
df2=pd.DataFrame(
np.arange(7,15).reshape((4,2)),
index=['b','c','d','e'],
columns=['Ohio','Nevada']
)
pd.merge(df1,df2,left_index=True,right_index=True,how='inner')
轴向拼接
matrix=np.arange(9).reshape((3,3))
np.concatenate([matrix,matrix],axis=0) #竖直拼接
s1=pd.Series([1,2],index=['a','b'])
s2=pd.Series([3,4],index=['c','d'])
s3=pd.Series([5,6],index=['e','f'])
pd.concat([s1,s2,s3],axis=1,join='outer') #水平拼接
在拼接的时候可以使用key参数生成层级索引:
df1=pd.DataFrame(
np.arange(4).reshape((2,2)),
index=['a','b'],
columns=['one','two']
)
df2=pd.DataFrame(
4+np.arange(4).reshape((2,2)),
index=['a','c'],
columns=['three','four']
)
pd.concat([df1,df2],axis=1,keys=['level_1','level_2'],join='outer')
数据重叠
当两个数据集的部分区域有相同的行列索引时,可以用另一个数据集相应位置的数据来填补前一个数据集的缺失值:
df1=pd.DataFrame({
'a':[1,None,5,None],
'b':[None,2,None,6],
'c':[2,4,6,8]
})
df2=pd.DataFrame({
'a':[5,4,None,3,7],
'b':[None,3,4,6,8]
})
df1.combine_first(df2) #用df2来填充df1
旋转与整形
(待补充)