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 where和DataFrame 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)
我更喜欢使用pandas' ,因为它不太违反直觉(至少对我来说)。maskwhere
(df['A']/df['B']).mask(df['A']<0) | (df['B']>0), df['A']+df['B'])
Run Code Online (Sandbox Code Playgroud)
在这里,列A和B被添加到条件成立的地方,否则它们的比率保持不变。