我有一个数据框,例如:
matrix = [(222, ['A','B','C'], [1,2,3]),
(333, ['A','B','D'], [1,3,5])]
df = pd.DataFrame(matrix, columns=['timestamp', 'variable', 'value'])
timestamp variable value
222 ['A','B','C'] [1,2,3]
333 ['A','B','D'] [1,3,5]
,并希望对其进行透视,以便保留timestamp
的值,variable
列中的唯一值成为附加列,而value
中的值将在各个列中排序。
输出应如下所示:
timestamp A B C D
222 1 2 3 nan
333 1 3 nan 5
任何帮助将不胜感激! :)
答案 0 :(得分:3)
使用zip创建字典,并传递给DataFrame
构造函数:
a = [dict(zip(*x)) for x in zip(df['variable'], df['value'])]
print (a)
[{'A': 1, 'B': 2, 'C': 3}, {'A': 1, 'B': 3, 'D': 5}]
df = df[['timestamp']].join(pd.DataFrame(a, index=df.index))
print (df)
timestamp A B C D
0 222 1 2 3.0 NaN
1 333 1 3 NaN 5.0
如果还有许多其他列使用DataFrame.pop
提取列:
a = [dict(zip(*x)) for x in zip(df.pop('variable'), df.pop('value'))]
df = df.join(pd.DataFrame(a, index=df.index))
print (df)
timestamp A B C D
0 222 1 2 3.0 NaN
1 333 1 3 NaN 5.0
答案 1 :(得分:3)
首先使用unnest,然后仅使用pivot
unnesting(df,['variable','value']).pivot(*df.columns)
Out[79]:
variable A B C D
timestamp
222 1.0 2.0 3.0 NaN
333 1.0 3.0 NaN 5.0
def unnesting(df, explode):
idx = df.index.repeat(df[explode[0]].str.len())
df1 = pd.concat([
pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
df1.index = idx
return df1.join(df.drop(explode, 1), how='left')
答案 2 :(得分:2)
您可以将值和列名传递给pd.Series构造函数。这会自动将值扩展为所需的形状。
df.set_index('timestamp').apply(lambda row: pd.Series(row.value, index=row.variable), axis=1)
# outputs:
A B C D
timestamp
222 1.0 2.0 3.0 NaN
333 1.0 3.0 NaN 5.0