Dataframe 使用附加列从宽到长转换和重塑数据帧

Dataframe 使用附加列从宽到长转换和重塑数据帧,dataframe,indexing,pivot,melt,Dataframe,Indexing,Pivot,Melt,我有一个数据帧,我想从宽格式转换成长格式。但我不想使用所有列。 具体地说,我想融合以下数据帧 import pandas as pd data = {'year': [2014, 2018,2020,2017], 'model':[12, 14,21,8], 'amount': [100, 120,80,210], 'quality': ["low", "high","medium",&

我有一个数据帧,我想从宽格式转换成长格式。但我不想使用所有列。
具体地说,我想融合以下数据帧

import pandas as pd
data = {'year': [2014, 2018,2020,2017], 
        'model':[12, 14,21,8],
        'amount': [100, 120,80,210],
        'quality': ["low", "high","medium","high"]
       }

# pass column names in the columns parameter 
df = pd.DataFrame.from_dict(data)
print(df)
在此数据框中:

data2 = {'year': [2014, 2014, 2018, 2018, 2020, 2020, 2017, 2017], 
        'variable': ["model", "amount", "model", "amount", "model", "amount", "model", "amount"],
        'value':[12, 100, 14, 120, 21, 80, 8, 210],
        'quality': ["low", "low", "high", "high", "medium", "medium", "high", "high"]
       }

# pass column names in the columns parameter 
df2 = pd.DataFrame.from_dict(data2)
print(df2)
我用不同的输入参数组合尝试了pd.melt(),如果我不考虑柱的质量,它会以某种方式工作。但根据结果,我不能跳过质量栏。此外,我还尝试了df.pivot()、df.pivot_table()和pd.wide_to_long()。都有好几种组合。但不知何故,我没有得到预期的结果。在执行任何pd.melt()操作之前,将列year和quality放入数据框索引可能会有所帮助

非常感谢您事先的帮助

import pandas as pd

data = {'year': [2014, 2018,2020,2017],
        'model':[12, 14,21,8],
        'amount': [100, 120,80,210],
        'quality': ["low", "high","medium","high"]
       }

# pass column names in the columns parameter
df = pd.DataFrame.from_dict(data)
print(df)

data2 = {'year': [2014, 2014, 2018, 2018, 2020, 2020, 2017, 2017],
        'variable': ["model", "amount", "model", "amount", "model", "amount", "model", "amount"],
        'value':[12, 100, 14, 120, 21, 80, 8, 210],
        'quality': ["low", "low", "high", "high", "medium", "medium", "high", "high"]
       }

# pass column names in the columns parameter
df2 = pd.DataFrame.from_dict(data2)
print(df2)

df3 = pd.melt(df, id_vars=['year', 'quality'], var_name='variable', value_name='value')
df3 = df3[['year', 'variable', 'value', 'quality']]
df3.sort_values('year', inplace=True)

print(df3)
输出(对于df3):

   year variable  value quality
0  2014    model     12     low
4  2014   amount    100     low
3  2017    model      8    high
7  2017   amount    210    high
1  2018    model     14    high
5  2018   amount    120    high
2  2020    model     21  medium
6  2020   amount     80  medium