【问题标题】:Iterating and modifying a Pandas Dataframe or groupby object迭代和修改 Pandas Dataframe 或 groupby 对象
【发布时间】:2018-01-15 06:15:12
【问题描述】:

我是 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

我该怎么做呢?遍历数据框或 groupby 对象并使用我想要的结构创建一个新的数据框,还是有更好的方法?

【问题讨论】:

  • 也许你可以试试df.set_index('SpeciesName').unstack('SpeciesName')
  • Blake,我们的行索引是 MultiIndex 还是你的列索引?
  • @ScottBoston 行是多索引的

标签: python pandas pandas-groupby


【解决方案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

【讨论】:

  • 谢谢,我可能需要数据不在 SpeciesName 下,就像在您的输出中一样。但是,您的回答让我看到了一些以前错过的 Pandas 功能,这些功能我可以使用。我会发布我所做的,你可以让我知道你的想法。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 2019-01-31
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2020-05-04
相关资源
最近更新 更多