根据其他列中的多个条件填充列

时间:2017-05-12 18:46:18

标签: python pandas numpy dataframe filtering

我正在努力解决这个问题。我有一个像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,但我确实关心这里的可读性。

2 个答案:

答案 0 :(得分:5)

您可以创建一个字典,将颜色定义为数字映射,然后在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)

答案 1 :(得分:2)

使用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