【发布时间】:2021-12-10 01:57:32
【问题描述】:
假设我有一个如下数据框:
df = pd.DataFrame()
df['v'] = [0,0,0,0,0,1,1,1,1]
df['w'] = [1,1,1,1,1,0,0,0,0]
df['x'] = (df.v + df.w)+10
df['y'] = (df.v + df.w)+5
df['z'] = ...
我需要一个新列 df.z,以等于 df.x if df.v = 1 和 df.y if df.w = 1
当然,我可以在这里使用df.apply:
def non_vector(row):
if row['v'] == 1: return row['x']
if row['w'] == 1: return row['y']
df['z'] = df.apply(non_vector, axis=1)
print df
v w x y z
0 0 1 11 6 6
1 0 1 11 6 6
2 0 1 11 6 6
3 0 1 11 6 6
4 0 1 11 6 6
5 1 0 11 6 11
6 1 0 11 6 11
7 1 0 11 6 11
8 1 0 11 6 11
但是对于矢量化方法来说,这个问题似乎很简单,因为这实际上非常缓慢。
任何帮助表示赞赏。
【问题讨论】:
-
你有 python-2.7 标记什么是 pandas/numpy 版本?
-
@Henry Ecker,pandas 0.24.2 和 numpy 1.14.1
-
您可能希望将其包含在您的问题正文中,这样人们就不必阅读 cmets 即可找到它。自 2019 年以来,这两个模块中的可用方法都发生了相当大的增长和变化。
-
为什么不使用 df['v']*df['x']+df['w']*df['y']?
-
如果
v和w总是彼此相反的布尔值,那么您可以使用numpy.wherenumpy.org/doc/1.14/reference/generated/numpy.where.html
标签: python pandas python-2.7