我有以下数据框:
region pop_1 pop_1_source pop_2 pop_2_source pop_3 pop_3_source
a 99 x1 84 x2 61 x3
b 64 x1 65 x2 16 x3
c 92 x1 26 x2 6 x3
d 82 x1 60 x2 38 x3
e 45 x1 77 x2 42 x3
我可以通过以下方式计算每个区域中找到的最高值:
df['upper_limit'] = df[['pop_1','pop_2','pop_3']].max(axis=1)
如果我只比较两个人口,我就可以计算出最高人口的来源,即:
df['upper_limit_source'] = np.where(df.upper_limit == df['upper_limit'],df.pop_1,df.pop_2)
但是,如果我尝试将其展开以搜索所有三列,它就会失败。 我已经搜索了一个解决方案,但无法使用 np.where(np.logical_or 或类似的。
我是否遗漏了一些明显的东西?
最佳答案
我发现您的问题有点令人困惑(除其他外,df.upper_limit == df['upper_limit']
始终为真,并且您的“源”列都充满了 x1
(除了一个看起来像打字错误的 1x
)。
但是,您似乎想找出三列中哪是最大值,然后据此计算一个值。因此,要计算负责的列,您可以使用 np.argmax
:
import numpy as np
idmax = np.argmax(df[['pop_1','pop_2','pop_3']].as_matrix(), axis=1)
对于每一行,这将为您提供 0、1 或 2,具体取决于三列中的哪一列对最大值负责。
现在,例如,如果您想选择 pop_1_source
、pop_2_source
或 pop_3_source
,您可以根据索引选择使用 np.choose
:
np.choose(idmax, df[[`pop_1_source', 'pop_2_source', pop_3_source']].as_matrix().T)
关于python - np.where python pandas 的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679382/