我想将数据帧的行值转换为列标题,但我只想要一个同名的列。然后,我希望每个新列下的行值与列标题相同。我尝试过查看get_dummies、pivot、pivot_table、group_by。任何帮助都将不胜感激。
数据:
进口熊猫作为pd
In [1]: df = pd.DataFrame([['foo', 'bar', 'ham'], ['baz', 'foo', 'bar'], ['ham', 'baz', 'egg']], columns=['A', 'B', 'C'])
In [2]: df
Out[2]:
A B C
0 foo bar ham
1 baz foo bar
2 ham baz egg
我想要这个:
In [3]:
Out[3]:
foo bar baz ham egg
0 foo bar ham
1 foo bar baz
2 baz ham egg
谢谢。
其想法是将DataFrame转换为长格式,然后透视:
df = df.reset_index()
df = pd.melt(df, id_vars=['index']).pivot(index = 'index', values='variable', columns='value')
for c in df.columns:
df.loc[df[c].notna(), c] = c
value bar baz egg foo ham
index
0 bar NaN NaN foo ham
1 bar baz NaN foo NaN
2 NaN baz egg NaN ham
详细说明:
melt
将数据帧转换为以下形式:
index variable value
0 0 A foo
1 1 A baz
2 2 A ham
3 0 B bar
4 1 B foo
5 2 B baz
6 0 C ham
7 1 C bar
8 2 C egg
然后使用pivot使列成为所有唯一值:
value bar baz egg foo ham
index
0 B NaN NaN A C
1 C A NaN B NaN
2 NaN B C NaN A
然后简单地将所有非na列替换为列名。