【问题标题】:Get column name where value match with multiple condition python获取值与多个条件python匹配的列名
【发布时间】:2021-09-20 20:23:28
【问题描述】:

一整天都在寻找解决我的问题的方法,但找不到答案。我正在尝试遵循此主题的示例:Get column name where value is something in pandas dataframe 制作具有多个条件的版本。

我想提取列名(在列表下)where

值 == 4 /值 == 3
+
仅当没有 4 或/和 3 时,提取 value == 2 的列名

例子:

data = {'Name': ['Tom', 'Joseph', 'Krish', 'John'], 'acne': [1, 4, 1, 2], 'wrinkles': [1, 3, 4, 4],'darkspot': [2, 2, 3, 4] }  

df1 = pd.DataFrame(data)  
df1

df1
'''

    Name    acne    wrinkles    darkspot
0   Tom     1         1            2   
1   Joseph  4         3            2
2   Krish   1         4            3
3   John    2         4            4

'''

我正在寻找的结果

df2

    Name    acne    wrinkles    darkspot   problem
0   Tom     1         1            2       [darkspot]
1   Joseph  4         3            2       [acne, wrinkles]
2   Krish   1         4            3       [wrinkles, darkspot]
3   John    2         4            4       [wrinkles, darkspot]

'''

我尝试使用上面提到的主题中详细介绍的带有 lambda 的 apply 函数,但它只能接受一个参数。 如果有人可以帮助我,非常感谢您的回答:)

【问题讨论】:

    标签: python pandas dataframe extract columnname


    【解决方案1】:

    你可以使用布尔掩码:

    problems = ['acne', 'wrinkles', 'darkspot']
    
    m1 = df1[problems].isin([3, 4])  # main condition
    m2 = df1[problems].eq(2)         # fallback condition
    mask = m1 | (m1.loc[~m1.any(axis=1)] | m2)
    
    df1['problem'] = mask.mul(problems).apply(lambda x: [i for i in x if i], axis=1)
    

    输出:

    >>> df1
         Name  acne  wrinkles  darkspot               problem
    0     Tom     1         1         2            [darkspot]
    1  Joseph     4         3         2      [acne, wrinkles]
    2   Krish     1         4         3  [wrinkles, darkspot]
    3    John     2         4         4  [wrinkles, darkspot]
    

    【讨论】:

      【解决方案2】:

      您可以使用布尔掩码来确定您需要哪些列。

      首先检查任何值是否为 3 或 4,如果不是,则检查任何值是否为 2。形成复合掩码(下面的变量 m),在它们之间使用 |(或)两个条件。

      最后你可以NaN False 值,这样当你堆叠和groupby.agg(list) 你只剩下 True 的列标签。

      cols = ['acne', 'wrinkles', 'darkspot']
      
      m1 = df1[cols].isin([3, 4])
      # If no `3` or `4` on the rows, check if there is a `2`
      m2 = pd.DataFrame((~m1.any(1)).to_numpy()[:, None] &  df1[cols].eq(2).to_numpy(),
                         index=m1.index, columns=m1.columns)
      m = (m1 | m2)
      #    acne  wrinkles  darkspot
      #0  False     False      True
      #1   True      True     False
      #2  False      True      True
      #3  False      True      True
      
      # Assignment aligns on original DataFrame index, i.e. `'level_0'`
      df1['problem'] = m.where(m).stack().reset_index().groupby('level_0')['level_1'].agg(list)
      

      print(df1)
           Name  acne  wrinkles  darkspot               problem
      0     Tom     1         1         2            [darkspot]
      1  Joseph     4         3         2      [acne, wrinkles]
      2   Krish     1         4         3  [wrinkles, darkspot]
      3    John     2         4         4  [wrinkles, darkspot]
      

      【讨论】:

      • 你的回答很有趣。我想我用你的想法通过@SeaBean 上一篇文章中的文本将布尔值倍增。我再也找不到要投票的问题了:(。如果你还记得这篇文章...
      • 是的。我花了很长时间试图找出一个聪明的方法来获取列表,但最后一切都变成了行上的缓慢循环,所以在这种情况下可能不值得额外的堆叠体操。
      • @Corralien 嗯,不,我不能我一直在寻找自己,因为这是我用过几次的技巧,但很难搜索给定的东西,比如 .mul 不要搜索得很好在用户历史中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2016-12-07
      • 2020-02-28
      • 2014-09-11
      • 2020-09-09
      • 2022-09-27
      相关资源
      最近更新 更多