Python 使用前两行作为变量熔化数据帧

Python 使用前两行作为变量熔化数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,抱歉,但这让我很困惑,我想我可以使用iloc引用我的变量将以下数据帧传递到一个简单的pd.melt中,但它对我不起作用(我稍后会发布错误) 样品df Date, 0151, 0561, 0522, 0912 0,Date, AVG Review, AVG Review, Review, Review 1,Date NaN NaN NaN NaN 2,01/01/18 2

抱歉,但这让我很困惑,我想我可以使用iloc引用我的变量将以下数据帧传递到一个简单的pd.melt中,但它对我不起作用(我稍后会发布错误)

样品df

Date,     0151,        0561,       0522,   0912
0,Date,     AVG Review,  AVG Review, Review, Review 
1,Date      NaN          NaN          NaN    NaN
2,01/01/18  2            2.5          4        5 

如您所见,我的ID在第一行,审查类型在第二行,日期在第一列,审查的观察结果在日期的行中

我想做的是融化这个df,得到以下结果

ID,   Date,     Review,        Score
0151, 01/01/18, Average Review 2
我想我可以厚颜无耻地通过以下考试

ID,   Date,     Review,        Score
0151, 01/01/18, Average Review 2
pd.melt
pd.melt(df,id_vars=[df.iloc[0]],value_vars=df.iloc[1])

但是这抛出了一个错误,
“Series”对象是可变的,因此不能对它们进行散列

我已经看过了pd.melt的类似答案,也许是重塑还是取消?但我不知道该怎么做

非常感谢您的帮助

为尼克松编辑:

我的第一行有我唯一的ID

第二排有我的观察结果,在这种情况下,这是一种审查(一般,正常)

第三行之后,将变量分配给上述观察-我们称之为该分数


第一列有我的日期,它的分数按行排列。

另一种方法是将行设置为多索引的列级别,然后将它们堆叠起来。不过,元数据将存储为索引而不是列。不知道这是否重要

df = pd.DataFrame([
    ['Date',     '0151',        '0561',       '0522',   '0912'],
    ['Date',     'AVG Review',  'AVG Review', 'Review', 'Review'],
    ['Date',     'NaN',         'NaN',        'NaN',    'NaN'],
    ['01/01/18', 2,             2.5,          4,        5],
])

df = df.set_index(0)
df.index.name = 'Date'
df.columns = pd.MultiIndex.from_arrays([df.iloc[0, :], df.iloc[1, :]], names=['ID', 'Review'])
df = df.drop(df.index[[0, 1, 2]])

df.stack('ID').stack('Review')
输出:

Date      ID    Review    
01/01/18  0151  AVG Review      2
          0522  Review          4
          0561  AVG Review    2.5
          0912  Review          5
dtype: object

您可以使用
reset\u index

轻松地将索引还原为列“并且审查的观察结果在日期是成行的”,请您更好地解释您的数据结构好吗?@Nixon Done,希望它更清楚。您如何构建数据框架在这方面真的会有所帮助。我不确定在dataframe中索引或列与值的对比是什么。嘿@busybear我确实想在Pandas中构造相同的DF,但不确定如何进行。但是假设没有索引,那么当我加载DF时,我会创建一个。您是手动创建这个数据帧还是从文件或其他东西导入?无论哪种方式,都应该有明确的行和列索引。奇怪的是,“Date”出现了三次,第三行就是NaN。小心地创建数据帧应该是您的第一步。这让我非常接近,但是,有一些问题-我的列已经设置为ID,因此使用iloc会删除它们,并且最后一行代码抛出
无法从重复轴重新索引此错误。但是,您的代码适用于我的示例,问题在于我如何解释我的问题。让我想一想,然后四处玩玩,我会以更好的方式重新提问。谢谢你的时间。这不会太难适应。您只需将多索引设置为
[df.columns,df.iloc[0,:]]
。您还需要进行一些其他更改,以使其正常工作。