Pandas 枢轴? pivot_table?熔化?堆叠还是拆开?
Pandas pivot? pivot_table? melt? stack or unstack?
我有一个如下所示的数据框:
id Revenue Cost qty time
0 A 400 50 2 1
1 A 900 200 8 2
2 A 800 100 8 3
3 B 300 20 1 1
4 B 600 150 4 2
5 B 650 155 4 3
我正在努力做到这一点:
id Type 1 2 3
0 A Revenue 400 900 800
1 A Cost 50 200 100
2 A qty 2 8 8
3 B Revenue 300 600 650
4 B Cost 20 150 155
5 B qty 1 4 4
时间总是会重复 1-3,所以我需要在时间上转置或转置 1-3 的列
这是我目前尝试过的方法:
pd.pivot_table(df, values = ['Revenue', 'qty', 'Cost'] , index=['id'], columns='time').reset_index()
但这只会让一个非常长 table 将所有东西并排放置 vs 像这样堆叠:
Revenue qty Cost
1 2 3 1 2 3 1 2 3
在那种情况下,我需要将 Revenue、qty 和 Cost 转换成一行,并只使用 1、2、3 作为列名。因此,每个 'type' 的 ID 都会重复,但会根据时间 1-3 将其列出。
我们仍然可以做到 unstack
和 stack
df.set_index(['id','time']).stack().unstack(level=1).reset_index()
Out[24]:
time id level_1 1 2 3
0 A Revenue 400 900 800
1 A Cost 50 200 100
2 A qty 2 8 8
3 B Revenue 300 600 650
4 B Cost 20 150 155
5 B qty 1 4 4
替代方案,在 Pandas 1.1.0 上使用 melt and pivot :
(df
.melt(["id", "time"])
.pivot(["id", "variable"], "time", "value")
.reset_index()
.rename_axis(columns=None)
)
id variable 1 2 3
0 A Cost 50 200 100
1 A Revenue 400 900 800
2 A qty 2 8 8
3 B Cost 20 150 155
4 B Revenue 300 600 650
5 B qty 1 4 4
我有一个如下所示的数据框:
id Revenue Cost qty time
0 A 400 50 2 1
1 A 900 200 8 2
2 A 800 100 8 3
3 B 300 20 1 1
4 B 600 150 4 2
5 B 650 155 4 3
我正在努力做到这一点:
id Type 1 2 3
0 A Revenue 400 900 800
1 A Cost 50 200 100
2 A qty 2 8 8
3 B Revenue 300 600 650
4 B Cost 20 150 155
5 B qty 1 4 4
时间总是会重复 1-3,所以我需要在时间上转置或转置 1-3 的列
这是我目前尝试过的方法:
pd.pivot_table(df, values = ['Revenue', 'qty', 'Cost'] , index=['id'], columns='time').reset_index()
但这只会让一个非常长 table 将所有东西并排放置 vs 像这样堆叠:
Revenue qty Cost
1 2 3 1 2 3 1 2 3
在那种情况下,我需要将 Revenue、qty 和 Cost 转换成一行,并只使用 1、2、3 作为列名。因此,每个 'type' 的 ID 都会重复,但会根据时间 1-3 将其列出。
我们仍然可以做到 unstack
和 stack
df.set_index(['id','time']).stack().unstack(level=1).reset_index()
Out[24]:
time id level_1 1 2 3
0 A Revenue 400 900 800
1 A Cost 50 200 100
2 A qty 2 8 8
3 B Revenue 300 600 650
4 B Cost 20 150 155
5 B qty 1 4 4
替代方案,在 Pandas 1.1.0 上使用 melt and pivot :
(df
.melt(["id", "time"])
.pivot(["id", "variable"], "time", "value")
.reset_index()
.rename_axis(columns=None)
)
id variable 1 2 3
0 A Cost 50 200 100
1 A Revenue 400 900 800
2 A qty 2 8 8
3 B Cost 20 150 155
4 B Revenue 300 600 650
5 B qty 1 4 4