【问题标题】:Map DataFrame column name to appropriate cell [duplicate]将DataFrame列名映射到适当的单元格[重复]
【发布时间】:2021-08-02 18:38:06
【问题描述】:

这是我在这里的第一篇文章。

如果没有示例,我不完全知道如何提出这个问题,因此很难找到答案。 无论如何,我有一个看起来像这样的 DataFrame(有更多的列和数千行):

df = pd.DataFrame({"A": [1, 0, 0], "B": [0, 0, 1], "C": [0, 1, 0]})

我想创建额外的列,例如。 “类型”,其中每一行的值将是该行中包含 1 的列的列名。 例如:

df = pd.DataFrame({"A": [1, 0, 0], "B": [0, 0, 1], "C": [0, 1, 0], "Type": ["A", "C", "B"]})

我希望这是有道理的。

谢谢, 克里斯

【问题讨论】:

  • 欢迎来到stackoverflow。您拥有的表示称为“单热编码”,您需要将其转换为分类值。以前有人问过这个问题,例如here,但我想如果没有正确的关键字,确实很难找到!
  • 这些是 one-hot 编码列还是虚拟列?这对答案很重要。
  • 非常感谢 fsimonjetz,情况相同! ALollz - 这些是编码的。我在我的一列上使用了 MultiLabelBinarizer,这就是输出

标签: python pandas dataframe


【解决方案1】:

您可以使用.eq检查df是否等于1,然后使用idxmax(axis=1)获取该行中条目的列索引等于1,如下所示:

df['Type'] = df.eq(1).idxmax(axis=1)

或者在值是 0 和 1 的情况下简化它(感谢@wwii):

df['Type'] = df.idxmax(axis=1)

或者,你也可以使用df.dot,如下:

df['Type'] = df.dot(df.columns)   

结果:

print(df)

   A  B  C Type
0  1  0  0    A
1  0  0  1    C
2  0  1  0    B

【讨论】:

  • idxmax 应该对 0 和 1 进行操作,与 Trues 和 Falses 相同。
  • @wwii 你说得对!我只是用来处理一般情况,以防匹配的值不是 1,但是是的,我们可以在这种情况下简化它。谢谢!
【解决方案2】:

使用应用:

import pandas as pd

df = pd.DataFrame({"A": [1, 0, 0], "B": [0, 0, 1], "C": [0, 1, 0]})

def getColName(row):    
    x = (df.iloc[row.name] == 1)
    return x.index[x.argmax()]

df['Type'] = df.apply(getColName, axis=1)

print(df)

   A  B  C  Type
0  1  0  0  A
1  0  0  1  C
2  0  1  0  B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2021-06-12
    • 2016-09-02
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多