我正在努力优化一些代码以提高速度,并且我知道 Pandas 中的 .apply 并不是数据处理的最佳方法。我正在寻求以某种方式优化这段代码。
假设你有两列这样的
设置_一 | 套装_二 |
---|---|
'Foo' | '' |
'' | ‘酒吧’ |
'Foo' | ‘酒吧’ |
如果我想要 apply 语句中两列的第一个真值,我可以使用
df.apply(lambda x : x.Set_One or x.Set_Two)
这会导致
结果 |
---|
'Foo' |
‘酒吧’ |
'Foo' |
但是随着数据集变大,速度会变慢。考虑到这是一个相当简单的比较,并没有太多。
如果我能做到
result = df['Set_One'] or df['Set_Two']
,那么很好的解决方案是,但一系列的真值是不明确的。使用 &
或 |
运算符不考虑真实性(或在字符串上工作)。
此比较的最佳实践是什么?
到目前为止,我只尝试了一个向量化函数,它在功能上只是返回第一个真值。
def return_truthy(val1, val2):
return val1 or val2
vec_truthy = np.vectorize(return_truthy)
vec_truthy(df['Set_One'], df['Set_Two'])
使用此功能确实可以将速度提高约 10 倍,但看起来并不那么优雅。
您可以使用
numpy.logical_or
函数来完成此操作。
import pandas as pd
import numpy as np
df = pd.DataFrame({"Set_One":["Foo", "", "Foo"],
"Set_Two":["", "Bar", "Bar"]})
print(np.logical_or(df["Set_One"], df["Set_Two"]))
输出:
0 Foo
1 Bar
2 Foo
dtype: object