查找两列的最大值并根据条件在第三列中填充值
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 中存在的相应值,如下例所示。这里的条件是,如果 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
我有一个包含 4 列的 pandas 数据框 - A、B、C、D 和 E。我想按 A 列创建组,然后找到 B 列和 C 列的最大值,然后用D 中存在的相应值,如下例所示。这里的条件是,如果 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