【问题标题】:multiple conditions for np.where python pandasnp.where python pandas的多个条件
【发布时间】:2017-02-02 09:54:16
【问题描述】:

我有以下数据框:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    【讨论】:

    • 你是对的,是复制/粘贴错误,已编辑 df 以显示正确的源代码。感谢您的回答,完美运行!
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2016-08-04
    • 2022-06-13
    • 2020-04-02
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多