python - np.where python pandas 的多个条件

标签 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 或类似的。

我是否遗漏了一些明显的东西?

最佳答案

我发现您的问题有点令人困惑(除其他外,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)

关于python - np.where python pandas 的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679382/

相关文章:

python - join() 只接受一个参数(给定 2 个)

python - 二维 numpy 数组的条件数学运算检查一维并在不同维度上执行不同的操作

python - 为什么 .ix 包含在索引范围的末尾?

python - 用 Python 中特定列的先前值填充 NaN

Python Pandas : remove duplicate in csv file with no headings

python - 解析的 SymPy 表达式的导数始终为 0

python - 如何使用 Pandas 按类别分组然后计算单词的频率

python - 没有 Spark 的 Kafka 到 Pandas 数据框

python - 为 pypy 构建 pandas

Python error_time 数据与格式不匹配