假设我有以下 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)
Run Code Online (Sandbox Code Playgroud)
结果:
a b c
0 0 0 6
1 0 3 7
2 1 4 8
3 2 5 9
Run Code Online (Sandbox Code Playgroud)
我需要根据条件将值从上述列传递到新列:
if df.a > 0 then value df.a
else if df.b > 0 then value df.b
else value df.c
Run Code Online (Sandbox Code Playgroud)
现在我尝试:
df['value'] = [x if x > 0 else 'ww' for x in df['a']]
Run Code Online (Sandbox Code Playgroud)
但不知道如何在此输入更多条件。
预期结果:
a b c value
0 0 0 6 6
1 0 3 7 3
2 1 4 8 1
3 2 5 9 2
Run Code Online (Sandbox Code Playgroud)
谢谢你的辛勤工作。
jez*_*ael 10
使用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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
小智 6
您还可以使用列表理解:
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'])]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22121 次 |
| 最近记录: |