如何从列切片中的行值创建列标题,从而使列行值与列标题匹配



我想将数据帧的行值转换为列标题,但我只想要一个同名的列。然后,我希望每个新列下的行值与列标题相同。我尝试过查看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列替换为列名。

最新更新