【问题标题】:Create new categorical variable based on multiple binary columns基于多个二进制列创建新的分类变量
【发布时间】:2020-01-13 14:52:10
【问题描述】:

我有一个包含许多二进制变量的数据框,我想根据其中许多二进制变量创建一个具有分类值的新变量

我的数据框是这样的

gov_winner    corp_winner    in part
        1              0           0
        0              1           0
        0              0           1

我要创建的变量名为winning_party,看起来像这样

gov_winner    corp_winner    in part    winning_party
        1              0           0             gov
        0              1           0            corp
        0              0           1         in part

我开始尝试以下代码但尚未成功:

 harrington_citations = harrington_citations.assign(winning_party=lambda x: x['gov_winner'] 
 == 1 then x = 'gov' else x == 0)

使用 anky_91 的回答我得到以下错误:

TypeError: can't multiply sequence by non-int of type 'str'

【问题讨论】:

  • 只有10 填充的列?
  • df@df.columns 有效吗?

标签: python pandas variables binary categorical-data


【解决方案1】:

您可以使用点积:

df.assign(Winner_Party=df.dot(df.columns))
#df.assign(Winner_Party=df @ df.columns)

   gov_winner  corp_winner  in_part Winner_Party
0           1            0        0   gov_winner
1           0            1        0  corp_winner
2           0            0        1      in_part

【讨论】:

  • 我用我得到的错误更新了我的答案。一个问题可能是我正在使用的实际数据框有许多变量没有包含在我正在创建的这个新变量中。谢谢。
  • 我可以只用我用来创建这个新变量的变量制作一个 df,看看你的答案是否有效......
  • @GrahamStreich 可能是您的列不仅有 1 和 0 ,请过滤掉这些列并尝试
【解决方案2】:

idxmax 怎么样,注意这只会选择第一个 max ,您有多个单元格等于每行 1 个,您可能想尝试 Jez 的解决方案

df['Winner_Party']=df.eq(1).idxmax(1)

【讨论】:

    【解决方案3】:

    如果每行总是只有一个1 使用DataFrame.dot,您也可以只过滤10 之前的列:

    df1 = df.loc[:, df.isin([0,1,'0','1']).all()].astype(int)
    df['Winner_Party'] = df1.dot(df1.columns)
    

    但是如果每行有多个 1 并且需要所有匹配的值添加分隔符,然后将其删除:

    df['Winner_Party'] = df1.dot(df1.columns + ',').str.rstrip(',')
    
    print (df)
       gov_winner  corp_winner  in part Winner_Party
    0           1            0        0   gov_winner
    1           0            1        0  corp_winner
    2           0            0        1      in part
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2019-06-28
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多