堆叠大熊猫时DataFrame,Series会返回a.通常在我堆叠之后DataFrame,我将其转换回来DataFrame.但是,来自堆叠数据的默认名称使列重命名有点hacky.我正在寻找的是一种更简单/内置的方法,可以在堆叠后为列提供合理的名称.
例如,对于以下内容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
Run Code Online (Sandbox Code Playgroud)
我将它堆叠并转换回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
Run Code Online (Sandbox Code Playgroud)
所以为了恰当地命名这些列,我需要做这样的事情:
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
Run Code Online (Sandbox Code Playgroud)
理想情况下,解决方案看起来像这样:
df.stack(new_index_name='var_name', new_col_name='value')
Run Code Online (Sandbox Code Playgroud)
但是看看它看起来不像的文档stack需要任何这样的论点.在熊猫中有更简单/内置的方式来处理这个工作流程吗?
unu*_*tbu 14
pd.melt通常用于将DataFrames从"宽"格式转换为"长格式".pd.melt如果首先将id和date索引级别转换为列,则可以在此处使用:
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
Run Code Online (Sandbox Code Playgroud)
chr*_*isb 12
所以这里有一种方法,你可以找到一个更清洁,使用的事实,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
Run Code Online (Sandbox Code Playgroud)
chrisb 答案的管道友好替代方案:
df.stack().rename_axis(['id', 'date', 'var_name']).rename('value').reset_index()
Run Code Online (Sandbox Code Playgroud)
如果显式优于隐式:
(
df
.stack()
.rename_axis(index={'id': 'id', 'date': 'date', None: 'var_name'})
.rename('value')
.reset_index()
)
Run Code Online (Sandbox Code Playgroud)
使用 dict 映射器时,您可以跳过应该保持不变的名称:
df.stack().rename_axis(index={None: 'var_name'}).rename('value').reset_index()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12054 次 |
| 最近记录: |