熊猫有条件地创建系列/数据框列

新手上路,请多包涵

How do I add a color column to the following dataframe so that color='green' if Set == 'Z' , and color='red' otherwise?

     Type       Set
1    A          Z
2    B          Z
3    B          X
4    C          Y

原文由 user7289 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 550
2 个回答

如果您只有两种选择:

 df['color'] = np.where(df['Set']=='Z', 'green', 'red')

例如,

 import pandas as pd
import numpy as np

df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)

产量

  Set Type  color
0   Z    A  green
1   Z    B  green
2   X    B    red
3   Y    C    red


如果您有两个以上的条件,请使用 np.select 。例如,如果您希望 color

  • yellow(df['Set'] == 'Z') & (df['Type'] == 'A')
  • 否则 blue(df['Set'] == 'Z') & (df['Type'] == 'B')
  • 否则 purple(df['Type'] == 'B')
  • 否则 black ,

然后使用

df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
    (df['Set'] == 'Z') & (df['Type'] == 'A'),
    (df['Set'] == 'Z') & (df['Type'] == 'B'),
    (df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)

产生

  Set Type   color
0   Z    A  yellow
1   Z    B    blue
2   X    B  purple
3   Y    C   black

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

列表理解是另一种有条件地创建另一列的方法。如果您在列中使用对象数据类型,就像在您的示例中一样,列表理解通常优于大多数其他方法。

示例列表理解:

 df['color'] = ['red' if x == 'Z' else 'green' for x in df['Set']]

%timeit 测试:

 import pandas as pd
import numpy as np

df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
%timeit df['color'] = ['red' if x == 'Z' else 'green' for x in df['Set']]
%timeit df['color'] = np.where(df['Set']=='Z', 'green', 'red')
%timeit df['color'] = df.Set.map( lambda x: 'red' if x == 'Z' else 'green')

1000 loops, best of 3: 239 µs per loop
1000 loops, best of 3: 523 µs per loop
1000 loops, best of 3: 263 µs per loop

原文由 cheekybastard 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题