堆叠 pandas DataFrame 时设置列名

新手上路,请多包涵

当堆叠熊猫 DataFrame 时,返回 Series 。通常在我堆叠 a DataFrame 之后,我将它转换回 DataFrame 。但是,来自堆叠数据的默认名称使得重命名列有点麻烦。我正在寻找的是一种更简单/内置的方法,可以在堆叠后为列提供合理的名称。

例如,对于以下 DataFrame

 In [64]: df = pd.DataFrame({'id':[1,2,3],
    ...:                    'date':['2015-09-31']*3,
    ...:                    'value':[100, 95, 42],
    ...:                    'value2':[200, 57, 27]}).set_index(['id','date'])

In [65]: df
Out[65]:
               value  value2
id date
1  2015-09-31    100     200
2  2015-09-31     95      57
3  2015-09-31     42      27

我将其堆叠并将其转换回 DataFrame 如下所示:

 In [68]: df.stack().reset_index()
Out[68]:
   id        date level_2    0
0   1  2015-09-31   value  100
1   1  2015-09-31  value2  200
2   2  2015-09-31   value   95
3   2  2015-09-31  value2   57
4   3  2015-09-31   value   42
5   3  2015-09-31  value2   27

所以为了适当地命名这些列,我需要做这样的事情:

 In [72]: stacked = df.stack()

In [73]: stacked
Out[73]:
id  date
1   2015-09-31  value     100
                value2    200
2   2015-09-31  value      95
                value2     57
3   2015-09-31  value      42
                value2     27
dtype: int64

In [74]: stacked.index.set_names('var_name', level=len(stacked.index.names)-1, inplace=True)

In [88]: stacked.reset_index().rename(columns={0:'value'})
Out[88]:
   id        date var_name  value
0   1  2015-09-31    value    100
1   1  2015-09-31   value2    200
2   2  2015-09-31    value     95
3   2  2015-09-31   value2     57
4   3  2015-09-31    value     42
5   3  2015-09-31   value2     27

理想情况下,解决方案看起来像这样:

 df.stack(new_index_name='var_name', new_col_name='value')

但是看看 文档,它看起来不像 stack 接受任何这样的论点。 pandas 中是否有更简单/内置的方式来处理此工作流程?

原文由 aensm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 685
2 个回答

pd.melt 通常用于将数据帧从“宽”格式转换为“长”格式。如果首先将 iddate 索引级别转换为列,则可以在此处使用 pd.melt

 In [56]: pd.melt(df.reset_index(), id_vars=['id', 'date'], value_vars=['value', 'value2'], var_name='var_name', value_name='value')
Out[56]:
   id        date var_name  value
0   1  2015-09-31    value    100
1   2  2015-09-31    value     95
2   3  2015-09-31    value     42
3   1  2015-09-31   value2    200
4   2  2015-09-31   value2     57
5   3  2015-09-31   value2     27

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

因此,您可能会发现一种更简洁的方法,使用 columnsSeries 也可以带有名称这一事实。

 In [45]: df
Out[45]:
               value  value2
id date
1  2015-09-31    100     200
2  2015-09-31     95      57
3  2015-09-31     42      27

In [46]: df.columns.name = 'var_name'

In [47]: s = df.stack()

In [48]: s.name = 'value'

In [49]: s.reset_index()
Out[49]:
   id        date var_name  value
0   1  2015-09-31    value    100
1   1  2015-09-31   value2    200
2   2  2015-09-31    value     95
3   2  2015-09-31   value2     57
4   3  2015-09-31    value     42
5   3  2015-09-31   value2     27

原文由 chrisb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题