【问题标题】:How can I create column headers from row values in a slice of columns resulting in the column row values matching the column headers?如何从列切片中的行值创建列标题,从而使列行值与列标题匹配?
【发布时间】:2020-12-09 16:41:19
【问题描述】:

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

谢谢。

【问题讨论】:

  • 为什么最后一行没有火腿?
  • 对不起,我错过了。谢谢你指出这一点。我现在已经解决了。

标签: python pandas dataframe header unique


【解决方案1】:

想法是将DataFrame转换为长格式,然后进行pivot:

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 会将 DataFrame 转换为以下形式:

   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 列替换为列名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多