python - 堆叠 pandas DataFrame 时设置列名

标签 python pandas

当堆叠一个 pandas DataFrame 时,返回一个 Series。通常在我堆叠一个 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')

但是看着 docs它看起来不像 stack 接受任何这样的参数。 pandas 中是否有更简单/内置的方法来处理此工作流程?

最佳答案

所以这里有一种您可能会发现更简洁的方法,利用 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

关于python - 堆叠 pandas DataFrame 时设置列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998893/

相关文章:

python - 无法使用具有实际名称的 flask 下载文件

python - 将图例添加到 LineCollection 图中

python - 在 Pandas 中使用 groupby 和向量平均值的前所未有的 TypeError

Python Pandas 读取具有可变前导码长度的 csv 文件

python - 在比较过程中,如何使 NaN 数值低于任何其他数值?

python - 如何在 Python 控制台应用程序中使用自动完成功能?

python - 有没有办法根据Python中的一列或多列中具有相似值的行来选择表中的某些行?

Python 数据帧 : replace or combine selected values into main DataFrame

python - 在一行中的一行 pandas DataFrame 中分配多个列值

python - 有没有办法改变 pytest 的 .cache 目录的位置?