pandas 将列转为行

pro*_*uri 7 python pandas

我有一个数据框,如下所示,我对其进行了一些操作。

原始数据帧 df:

index   item   value    day     time
0   P472   0.126    2011-12-08  00:00:00
1   P472   0.12     2011-12-08  00:30:00
2   P472   0.119    2011-12-08  01:00:00
3   P472   0.425    2011-12-08  01:30:00
4   P472   0.154    2011-12-08  02:00:00
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码旋转数据框以生成下面的新数据框:

df_pivoted = df.pivot_table(index=['item', 'day'], columns='time',
                 values='value', aggfunc='first').reset_index()
Run Code Online (Sandbox Code Playgroud)

df_pivoted:

index   item   day      00:00:00 00:30:00 ... 23:30:00
0   P472   2011-12-08   0.126    0.12     ...   0.18
1   P473   2011-12-08   0.5      0.55     ...   0.30
Run Code Online (Sandbox Code Playgroud)

现在我想将 df_pivoted 重新调整到原始数据帧的布局中,即将 00:00:00 到 23:30:00 的列折叠到时间列,特定一天内的每个 24 小时时间,并重新引入值列(使用 df_pivoted.stack?),但我不知道如何做到这一点。有什么想法吗>?

jpp*_*jpp 7

pd.pivot_table可以通过以下方式实现相反的操作pd.melt

df_melted = df_pivoted.melt(id_vars=['index', 'item', 'day', 'time'],
                            value_vars=['value']).drop('variable', 1)

print(df)

   index  item  value         day      time
0      0  P472  0.126  2011-12-08  00:00:00
1      1  P472  0.120  2011-12-08  00:30:00
2      2  P472  0.119  2011-12-08  01:00:00
3      3  P472  0.425  2011-12-08  01:30:00
4      4  P472  0.154  2011-12-08  02:00:00
Run Code Online (Sandbox Code Playgroud)

值得指出的是,这是有效的,因为您的聚合函数'first'及其组合['index', 'item', 'day', 'time']是唯一的。如果不是,那么数据透视表将聚合数据并丢失无法再次组合在一起的信息。