【问题标题】:Find max of two columns and populate with value in third column based on a condition查找两列的最大值并根据条件在第三列中填充值
【发布时间】:2021-09-18 06:54:24
【问题描述】:

我有一个带有 4 列的 pandas 数据框 - A、B、C、D 和 E。我想按 A 列创建组,然后找到 B 和 C 列的最大值,然后用 D 中存在的相应值填充 E如下例所示。这里的条件是,如果 B 列中的一个组全为 1,则 E 列将被填充为 0。

我的预期输出

column A    column B    column C    column D    Column E
AA         1           a            12          15
AA         2           d            13          15
AA         3           b            14          15
AA         3           e            15          15
BB         1           c            15          17
BB         1           d            16          17
BB         2           b            17          17
BB         2           a            18          17
CC         1           a            11          0
CC         1           c            10          0
CC         1           b            11          0
CC         1           e            15          0

我的代码:

df1 = df1.sort_values(by=['column A', 'column B','column C','column D'],ascending=[True,False, False,False])
col_e_df = df1.groupby(['column A']).agg({'column D':['first']})
col_e__df = tranform_aggregated_data(col_e_df, {'first':  'column D'})
#print(col_e_df.sort_index())
df1 = df1.merge(col_e__df, on = ['column A'])

当数字大于 2 时,此代码可以正常工作,但是当 B 列的任何组全为 1 时,它不会填充 0(这是我需要做的)。当我添加 if 条件时,数字大于 2 的组也显示 0。

出错的代码行

col_e_df = (np.where(df1['column B'] >= 2, df1.groupby(['column A'])['columnD'].transform('first') , 0))

The actual output from my code is
column A    column B    column C    column D    Column E
AA          1           a           12          0
AA          2           d           13          15
AA          3           b           14          15
AA          3           e           15          15
BB          1           c           15          0
BB          1           d           16          0
BB          2           b           17          17
BB          2           a           18          17
CC          1           a           11          0
CC          1           c           10          0
CC          1           b           11          0
CC          1           e           15          0

【问题讨论】:

    标签: python filter max


    【解决方案1】:

    试试:

    df = df.sort_values(
        by=["column A", "column B", "column C", "column D"],
        ascending=[True, False, False, False],
    )
    
    df["Column E"] = df.groupby("column A")["column D"].transform("first")
    
    # set "Column E" to 0 if all values in "column B" == 1
    df["Column E"] = np.where(
        df.groupby("column A")["column B"].transform(lambda x: x.eq(1).all()),
        0,
        df["Column E"],
    )
    print(df.sort_index())
    

    打印:

       column A  column B column C  column D  Column E
    0        AA         1        a        12        15
    1        AA         2        d        13        15
    2        AA         3        b        14        15
    3        AA         3        e        15        15
    4        BB         1        c        15        17
    5        BB         1        d        16        17
    6        BB         2        b        17        17
    7        BB         2        a        18        17
    8        CC         1        a        11         0
    9        CC         1        c        10         0
    10       CC         1        b        11         0
    11       CC         1        e        15         0
    

    【讨论】:

    • 感谢@Andrej Kesely 的快速回复。该代码有效。
    猜你喜欢
    • 2021-09-18
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多