样本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
第二行显示了我的观察结果,在这种情况下,它是一种检查类型(平均,正常)
第三行及以后的变量已分配给上述观察值-称此分数。
第一列的日期是我的日期,每一行的得分都是
答案 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
轻松地将索引还原为列。