Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在另一列中使用列名重塑dataframe_Python_Pandas_Dataframe - Fatal编程技术网

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