数据规整:层次化索引、合并、重塑

pandas的数据规整包含三个方面的内容:1.层次化索引;2.数据集合并;3.重塑。

1 层次化索引
在一个轴上拥有多个索引,能以低纬度处理高纬度问题;

  1. )层次化索引的赋值:data=pd.Series(np.random.randn(4),index=[['a','a','b','b'],[1,2,1,3]])

  2. )层次化索引的子集提取:
    data['b'] # 外层索引提取
    data['a':'b'] # 索引直接提取,只能提取连续索引
    data.loc[['a','b']] # 多个单独的索引提取,利用loc函数
    data.loc['a':'b',1:3] # loc函数也可以提取连续的多个索引值
    data.loc[:,1] # 利用loc函数,依据内层索引来选取子集

  3. )层次化索引转化为DataFrame数组:unstack( )和stack( )
    data.unstack() # 多层索引转化为数组,外层索引为index,内层索引为columns;
    data.unstack().stack() # 数组,还原成 多层索引Series

  4. )层次化索引中,不同索引轴的转换:(data.index.names=['name1','name2']
    data.swaplevel('name1','name2') # 利用索引的名称进行转换,需要提前命名
    data.swaplevel(0,1) # 利用索引的代号,进行转换

  5. )层次化索引的排序:
    data.sort_index(level=0) # 依据外层索引进行排序(第一列索引)

  6. )合并相同索引名称:
    data.sum(level='name1') # name1中,相同索引值得数据求和,形成新的数组

  7. )在DataFrame数组中,其中两列以上的数据作为索引
    frame.set_index(['c','d'],drop=False) # 以c、d两列,作为层次化索引的值,默认去掉两列;可通过drop参数,保留两列
    frame.reset_indx( ) # 层次化索引,被还原到数组中

2 数据集合并

  1. )merge函数(== join,关系型数据库的核心)
    (1) 数组df1和df2:
    pd.merge(df1,df2) # 默认依据df1和df2的相同列索引,进行合并,相同名字的行保留;默认交集
    pd.merge(df1,df2,on=‘key’) # 依据‘key’列数据,值相同的行合并,不同行舍弃;
    pd.merge(df1,df2,left_on=‘key1’,right_on=‘key2’) # 对齐两数组中,key1列和key2列,值相同的行合并,不同舍弃
    (2)合并的方式:‘left’-保留左表的数据值、‘right’-保留右表的数据值、‘outer’-并集、‘inner’-交集
    pd.merge(df1,df2,how=‘outer’)
    (3)合并后的不同列存在同名,则 suffixes 参数进行后缀命名:
    pd.merge(df1,df2,on=‘key1’,how=‘outer’,suffixes=(’_x,’’_y’)) # 两数组的key2列名称变为:key2_x、key2_y
    (4)合并参考列包含索引时,left_index=True、right_index=True 参数来确定是否包含索引
    pd.merge(df1,df2,left_on=‘key1’,right_index=True) # 依据key1列和右数组的索引,合并数组
    pd.merge(df1,df2,how=‘inner’,left_on=[‘key1’,‘key2’],right_index=True) # 依据key1和key2列,以及右数组的层次索引,合并两数组

    *(5)join函数
    df1.join(df2,on=‘key’) # 默认左连接,保留左边表的行索引;
    df1.join([df2,df3]) # 连接多个不同数组
    Tips: join函数的连接对象,不能相同的列索引
    而 merge函数的连接对象,可以有相同的列索引suffixes 参数重新命名

  2. )concat函数
    (1)Series类型数据
    pd.concat([s1,s2,s3]) # 默认的 axis=0, 合并的数据s1、s2、s3视为行向量,形成一列数据集;
    pd.concat([s1,s2,s3],axis=1) # axis=1,合并的数据s1、s2、s3视为列向量,合并为三列,不存在的值填充NaN;
    pd.concat([s1,s4],axis=1,join=‘inner’) # 交集,
    pd.concat([s1,s4],axis=1,join_axes=[[‘a’,‘c’,‘b’,‘e’]]) # 合并两series,并保留设定的行;

在合并后的数组中区分数据,利用层次化索引:
pd.concat([s1,s2,s3],key=[‘one’,‘two’,‘three’]) # key 为外层索引的名称

合并series数据,可以形成dataframe:
pd.merge([s1,s2,s3],axis=1,key=[‘one’,‘two’,‘three’]) # key 为列索引的名字

(2)DataFrame类型数据
pd.concat([df1,df2],axis=1,key=[,]) # 数据视为列向量,合并形成两列
pd.concat([df1,df2],axis=0,ignore_index=True) # df1和 df2视为行向量,合并,行索引重新命名0~N;

  • df1.combine_first(df2) # 当df1的数据中存在NaN时,使用df2中对应数据来填充

3 数据重塑(Dataframe和Series的数据转换:unstack和stack)

  1. ) result=data.stack() # data 数组转化为 Series类型,层次化索引;
    result2 = result.unstack() # 默认:以外层索引为行索引,内层为列索引,形成DataFrame;

result.unstack(0) # 以原行索引为 列索引
result.unstack(‘name’) # 以索引名称对应的索引作为行索引

  1. ) unstack() 形成数组,会引入缺失值NaN;
    stack() 形成Series , 会省去缺失值NaN,data.stack(dropna=False),不省去NaN。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值