利用Python进行数据分析——数据合并与整形

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

旋转与整形

(待补充)

猜你喜欢

转载自blog.csdn.net/qq_31823267/article/details/79920229