Python 在另一列中使用列名重塑dataframe
我有一个结构相当不直观的数据帧:Python 在另一列中使用列名重塑dataframe,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个结构相当不直观的数据帧: device1 device2 column_name 1 1 date 111 211 param1 112 212 param2 2 2 date 121 221 param1 122 222 param2 3 3 date
device1 device2 column_name
1 1 date
111 211 param1
112 212 param2
2 2 date
121 221 param1
122 222 param2
3 3 date
131 231 param1
132 232 param2
我很难将其转换为所需的数据帧:
date param1 param2
device1 1 111 112
2 121 122
3 131 132
device2 1 211 212
2 221 222
3 231 232
玩pivot
,stack
/unstack
让我离目标更近了,但从未达到目标
我该怎么做呢?您可以
堆叠
要重塑的数据帧,然后使用groupby
+cumcount
创建顺序计数器以识别不同的行,最后使用设置索引
创建多级索引,并使用取消堆叠
重塑:
d = df.set_index('column_name').stack()
i = d.groupby(level=[0, 1]).cumcount()
out = d.to_frame().set_index(i, append=True)[0].unstack(0).droplevel(1)
一种可能的解决办法:
tmp = df.melt("column_name")
tmp = tmp.set_index(['variable', 'column_name', tmp.column_name.eq('date').cumsum()])["value"].unstack(-2).droplevel(-1)
tmp.columns.name = None
tmp
date param1 param2
variable
device1 1 111 112
device1 2 121 122
device1 3 131 132
device2 1 211 212
device2 2 221 222
device2 3 231 232
困难在于在没有唯一标识符的情况下取消堆叠。tmp.column\u name.eq('date').cumsum()
的目的是为每个组提供一个id(按组我指的是date
、param1
和param2
的组合)。这帮助我理解了这一点。您可以使用with来重塑数据帧;与其他答案一样,您需要一个唯一的标识符:
(
df.melt("column_name")
.assign(unique_id=lambda x: x.groupby("column_name").cumcount())
.pivot(index=["unique_id", "variable"], columns="column_name", values="value")
.droplevel("unique_id")
.rename_axis(columns=None, index=None)
)
date param1 param2
device1 1 111 112
device1 2 121 122
device1 3 131 132
device2 1 211 212
device2 2 221 222
device2 3 231 232
(
df.melt("column_name")
.assign(unique_id=lambda x: x.groupby("column_name").cumcount())
.pivot(index=["unique_id", "variable"], columns="column_name", values="value")
.droplevel("unique_id")
.rename_axis(columns=None, index=None)
)
date param1 param2
device1 1 111 112
device1 2 121 122
device1 3 131 132
device2 1 211 212
device2 2 221 222
device2 3 231 232