【问题标题】:Filling a column based on multiple conditions from another columns根据来自另一列的多个条件填充一列
【发布时间】:2017-10-12 04:19:30
【问题描述】:

我正在为此苦苦挣扎。我有一个像这样的 DataFrame:

import pandas as pd

data = {'A': ['red', 'green', 'blue', 'green', 'yellow', 'blue'],
        'B': [1, 2, 1, 1, 2, 1]}

frame = pd.DataFrame(data)

我想根据“A”列中的多个条件创建一个新列。例如,如果“A”是红色或蓝色,我希望这个新列等于 10;如果“A”为绿色,则等于 20,依此类推。

问题是,我想我可以使用嵌套的np.where,但我确实关心这里的可读性。

【问题讨论】:

    标签: python pandas numpy dataframe filtering


    【解决方案1】:

    使用dot,因为它很有趣。

    s = pd.Series({'red': 10, 'blue': 10, 'green': 20, 'yellow': 30})
    frame.assign(new=pd.get_dummies(frame.A).dot(s))
    
            A  B  new
    0     red  1   10
    1   green  2   20
    2    blue  1   10
    3   green  1   20
    4  yellow  2   30
    5    blue  1   10
    

    或者,如果你真的,真的想要np.where

    a = frame.A.values
    red = a == 'red'
    blue = a == 'blue'
    green = a == 'green'
    yellow = a == 'yellow'
    new = np.where(red | blue, 10, np.where(green, 20, np.where(yellow, 30, -1)))
    frame.assign(new=new)
    
            A  B  new
    0     red  1   10
    1   green  2   20
    2    blue  1   10
    3   green  1   20
    4  yellow  2   30
    5    blue  1   10
    

    这也很整洁。仅限 Python 3,在 Python 2 中使用 dot 而不是 @

    a = frame.A.values
    red = a == 'red'
    blue = a == 'blue'
    green = a == 'green'
    yellow = a == 'yellow'
    
    new = np.column_stack([red | blue, green, yellow]) @ [10, 20, 30]
    frame.assign(new=new)
    
            A  B  new
    0     red  1   10
    1   green  2   20
    2    blue  1   10
    3   green  1   20
    4  yellow  2   30
    5    blue  1   10
    

    【讨论】:

      【解决方案2】:

      您可以创建一个定义颜色到数字映射的字典,然后在 A 列上使用 map 方法:

      color_to_num = {'red': 10, 'blue': 10, 'green': 20, 'yellow': 30}    
      frame['new'] = frame.A.map(color_to_num)
      
      frame
      #      A    B   new
      #0  red     1   10
      #1  green   2   20
      #2  blue    1   10
      #3  green   1   20
      #4  yellow  2   30
      #5  blue    1   10
      

      或者使用replace方法:

      frame['new'] = frame.A.replace(color_to_num)
      

      【讨论】:

      • 已解决。非常感谢。
      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2022-01-26
      • 2020-07-19
      • 2019-03-19
      • 1970-01-01
      相关资源
      最近更新 更多