【问题标题】:Vectorized conditional column向量化条件列
【发布时间】: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 = 1df.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']?
  • 如果 vw 总是彼此相反的布尔值,那么您可以使用 numpy.where numpy.org/doc/1.14/reference/generated/numpy.where.html

标签: python pandas python-2.7


【解决方案1】:

为什么不这样做:

df['z'] = np.where(df['v']==1, df['x'],np.where(df['v']==0,df['y'], np.nan))

如果df.v 只取值 0 和 1,那么

df['z'] = np.where(df['v']==1, df['x'],df['y'])

就够了。在这两种情况下,您都会得到:

v  w   x  y     z
0  0  1  11  6   6.0
1  0  1  11  6   6.0
2  0  1  11  6   6.0
3  0  1  11  6   6.0
4  0  1  11  6   6.0
5  1  0  11  6  11.0
6  1  0  11  6  11.0
7  1  0  11  6  11.0
8  1  0  11  6  11.0

【讨论】:

  • 我选择了df['z'] = df[‘v’]*df[‘x’]+df[‘w’]*df[‘y’],但这会派上用场。
猜你喜欢
  • 2016-05-15
  • 2016-07-03
  • 2012-07-07
  • 2018-12-16
  • 2017-08-01
  • 2021-07-29
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
相关资源
最近更新 更多