np.where python pandas的多个条件

时间:2016-09-24 17:59:05

标签: python pandas

我有以下数据框:

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或类似的东西)。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

我发现您的问题有点令人困惑(除其他事项外,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_sourcepop_2_sourcepop_3_source,根据索引,您可以使用np.choose

np.choose(idmax, df[[`pop_1_source', 'pop_2_source', pop_3_source']].as_matrix().T)