繁体   English   中英

查找最多两列并根据条件填充第三列中的值

[英]Find max of two columns and populate with value in third column based on a condition

我有一个包含 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

尝试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM