迭代和修改Pandas Dataframe或groupby对象

时间:2017-08-07 20:42:45

标签: python pandas pandas-groupby

我是Pandas的新手,正在使用表格的多索引数据集(由groupby制作):

Name 
    Year 
        Month 
             Day 
                DataA   DataB   SpeciesName   SpeciesValue
                  A       B         Name1        Value1
                  A       B         Name2        Value2
                  A       B         Name3        Value3

对于每个组(唯一名称,年份,月份,日),只有最后两列具有不同的值,其余列是相同的。我想让每个组包含一行。该行将使用SpeciesName值作为列标题,将SpeciesValue值作为条目。例如,上述组的结果应为:

Name 
    Year 
        Month 
             Day 
                DataA     DataB     Name1     Name2     Name3 
                  A         B       Value1    Value2    Value3

我该怎么做?迭代dataframe或groupby对象并使用我想要的结构创建一个新的数据框,或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

好的,使用set_indexunstack然后reset_index

df = pd.DataFrame({'Name':['Blake']*3,'Year':[2017]*3,
                  'Month':[1]*3,
                  'Day':[15]*3,
                  'DataA':['A']*3,
                  'DataB':['B']*3,
                  'SpeciesName':['Name1','Name2','Name3'],
                  'SpeciesValue':['Value1','Value2','Value3']})

df = df.set_index(['Name','Year','Month','Day'])

df

示例输入数据帧:

                     DataA DataB SpeciesName SpeciesValue
Name  Year Month Day                                     
Blake 2017 1     15      A     B       Name1       Value1
                 15      A     B       Name2       Value2
                 15      A     B       Name3       Value3

现在,让我们重塑数据帧:

df_out = df.set_index(['DataA','DataB','SpeciesName'],append=True)['SpeciesValue']\
  .unstack()\
  .reset_index(level=[-1,-2])

print(df_out)

输出:

SpeciesName          DataA DataB   Name1   Name2   Name3
Name  Year Month Day                                    
Blake 2017 1     15      A     B  Value1  Value2  Value3