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