融合前两行作为变量的数据框

时间:2018-11-28 14:54:59

标签: python pandas dataframe

抱歉,但这让我感到难过,我想我可以使用iloc将以下数据框传递到一个简单的pd.melt中,以引用我的变量,但它对我不起作用(我稍后会发布错误)< / p>

样本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

我以为我会很厚脸皮,只需通过以下内容

pd.melt pd.melt(df,id_vars=[df.iloc[0]],value_vars=df.iloc[1] )

但这会引发错误'Series' objects are mutable, thus they cannot be hashed

我看过与pd.melt类似的答案,也许是重塑还是取消枢轴?但是我迷路了。

非常感谢您的帮助。

为尼克松编辑:

我的第一行有我唯一的ID

第二行显示了我的观察结果,在这种情况下,它是一种检查类型(平均,正常)

第三行及以后的变量已分配给上述观察值-称此分数。

第一列的日期是我的日期,每一行的得分都是

1 个答案:

答案 0 :(得分:1)

pd.melt的替代方法是将行设置为多索引的列级别,然后stack。但是,您的元数据将存储为索引而不是列。不确定是否重要。

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_index轻松地将索引还原为列。