pandas if else 多列条件

新手上路,请多包涵

假设我有以下 df:

 import pandas as pd

data_dic = {
    "a": [0,0,1,2],
    "b": [0,3,4,5],
    "c": [6,7,8,9]
}
df = pd.DataFrame(data_dic)

结果:

    a  b  c
0  0  0  6
1  0  3  7
2  1  4  8
3  2  5  9

我需要根据条件将上列的值传递给新列:

 if df.a > 0 then value df.a
else if df.b > 0 then value df.b
else value df.c

现在我尝试:

 df['value'] = [x if x > 0 else 'ww' for x in df['a']]

但不知道如何在此输入更多条件。

预期结果:

    a  b  c value
0  0  0  6  6
1  0  3  7  3
2  1  4  8  1
3  2  5  9  2

谢谢你的辛勤工作。

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

阅读 637
2 个回答

使用 numpy.select

 df['value'] = np.select([df.a > 0 , df.b > 0], [df.a, df.b], default=df.c)
print (df)
   a  b  c  value
0  0  0  6      6
1  0  3  7      3
2  1  4  8      1
3  2  5  9      2

400k 行中矢量化和循环解决方案之间的区别:

 df = pd.concat([df] * 100000, ignore_index=True)

In [158]: %timeit df['value2'] = np.select([df.a > 0 , df.b > 0], [df.a, df.b], default=df.c)
9.86 ms ± 611 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [159]: %timeit df['value1'] = [x if x > 0 else y if y>0 else z for x,y,z in zip(df['a'],df['b'],df['c'])]
399 ms ± 52.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

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

您还可以使用列表理解:

 df['value'] = [x if x > 0 else y if y>0 else z for x,y,z in zip(df['a'],df['b'],df['c'])]

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

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