大熊猫相当于np.where

max*_*max 35 python numpy pandas

np.where具有矢量化if/else的语义(类似于Apache Spark的when/ otherwiseDataFrame方法).我知道我可以np.where在pandas上使用Series,但pandas经常定义自己使用的API而不是原始numpy函数,这对于pd.Series/ 通常更方便pd.DataFrame.

果然,我找到了pandas.DataFrame.where.但是,乍一看,它具有完全不同的语义.我找不到重写np.where使用pandas的最基本示例的方法where:

# df is pd.DataFrame
# how to write this using df.where?
df['C'] = np.where((df['A']<0) | (df['B']>0), df['A']+df['B'], df['A']/df['B'])
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗 或者是大熊猫where用于完全不同的用例,尽管名称相同np.where

Ale*_*lex 30

尝试:

(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
Run Code Online (Sandbox Code Playgroud)

的之间的差numpy whereDataFrame where是,默认值是由所提供的DataFrame是,where正在被调用的方法上(文档).

np.where(m, A, B)
Run Code Online (Sandbox Code Playgroud)

大致相当于

A.where(m, B)
Run Code Online (Sandbox Code Playgroud)

如果你想使用pandas进行类似的调用签名,你可以利用方法调用在Python中的工作方式:

pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A'] / df['B'])
Run Code Online (Sandbox Code Playgroud)

或不kwargs(注意:参数的位置顺序从不同numpy where 参数顺序):

pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
Run Code Online (Sandbox Code Playgroud)

  • 当条件满足时我们想要一个单一的值,我们该怎么办?我们不能真正说 `1.where(df['A']&gt;df['B'], other=df['C'])` (2认同)

rac*_*hwa 5

我更喜欢使用pandas' ,因为它不太违反直觉(至少对我来说)。maskwhere

(df['A']/df['B']).mask(df['A']<0) | (df['B']>0), df['A']+df['B'])
Run Code Online (Sandbox Code Playgroud)

在这里,列AB被添加到条件成立的地方,否则它们的比率保持不变。