当堆叠一个 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 中是否有更简单/内置的方法来处理此工作流程?
最佳答案
所以这里有一种您可能会发现更简洁的方法,利用 columns
和 Series
也可以携带名称这一事实。
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/