jwi*_*ley 5 python pivot melt pandas
我有一个粗略格式的熊猫数据框
print(df)
Time GroupA GroupB Value1 Value2
0 100.0 1.0 1.0 18.0 0.0
1 100.0 1.0 2.0 16.0 0.0
2 100.0 2.0 1.0 18.0 0.0
3 100.0 2.0 2.0 10.0 0.0
Run Code Online (Sandbox Code Playgroud)
其中Time是一个计数变量/时间戳,GroupA和GroupB是类别,以及Value1和Value2是数值量。此代码片段创建了一个模型数据框:
import numpy as np
values = np.zeros(shape=(4,5))
values[:,0] = 100
values[:,1] = [1]*2 + [2]*2
values[:,2] = [1,2]*2
values[:,3] = np.random.randint(low=10,high=20,size=(4))
df = pd.DataFrame(values,columns=['Time','GroupA','GroupB','Value1','Value2'])
Run Code Online (Sandbox Code Playgroud)
加载一些数据后,我想计算并填写Value2. 当它发生时(顺便说一句,因为Value2是Value1每个现有 ( GroupA, GroupB) 对中的时间序列函数),我发现通过首先将我的数据转换为以下形式来计算这些值最容易:
df_pivot = df.pivot_table(index='Time',columns=['GroupA','GroupB'],values=['Value1','Value2'], fill_value=0.0)
Run Code Online (Sandbox Code Playgroud)
然后在一些不相关的代码之后我填写了值
print(df_pivot)
Value1 Value2
GroupA 1.0 2.0 1.0 2.0
GroupB 1.0 2.0 1.0 2.0 1.0 2.0 1.0 2.0
Time
100.0 13 16 16 10 27 20 28 20
Run Code Online (Sandbox Code Playgroud)
现在我想将其“反透视”为df. 我可以通过循环df、查找 中的值df_pivot并填充它来手动执行此操作,但我更喜欢使用内置函数。尽管尝试使用 的变体df.melt,但由于df_pivot的分层列存在问题,我无法执行此反转。我最好的尝试是
dfm = df_pivot.reset_index().melt(id_vars="Time")
dfm.columns.values[1] = "HACK"
dfm = dfm.pivot_table(index=["Time","GroupA","GroupB"],columns="HACK",values="value").reset_index()
Run Code Online (Sandbox Code Playgroud)
产生数据框
print(dfm)
HACK Time GroupA GroupB Value1 Value2
0 100.0 1.0 1.0 13 27
1 100.0 1.0 2.0 16 20
2 100.0 2.0 1.0 16 28
3 100.0 2.0 2.0 10 20
Run Code Online (Sandbox Code Playgroud)
这有效,但并不让我觉得是最好的解决方案,或者非常便携(为什么melt会产生一个“NaN”列名?为什么我要手动查找该列的索引并重命名它?为什么我必须枢轴以撤消枢轴?)不过,我在尝试并查看文档和示例以寻找替代方案时不知所措。该melt函数有一个col_level看起来应该有帮助的参数,但我为此使用的任何有效值只会导致数据丢失(丢失“时间”、“组 A”或“组 B”数据)。
我认为stack更直接
df_pivot.stack([1,2]).reset_index()
Out[8]:
Time GroupA GroupB Value1 Value2
0 100.0 1.0 1.0 13 0
1 100.0 1.0 2.0 13 0
2 100.0 2.0 1.0 12 0
3 100.0 2.0 2.0 11 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |