如何用if/elif/else与列最小值计算Pandas DataFrame新列?
Pandas DataFrame 一行代码实现col_4列计算
原始数据与预处理代码
a = [{'name': 'A', 'col_1': 5, 'col_2': 3, 'col_3': 1.5}, {'name': 'B', 'col_1': 4, 'col_2': 2.5, 'col_3': None}, {'name': 'C', 'col_1': 8, 'col_2': None, 'col_3': None}, {'name': 'D', 'col_1': 7, 'col_2': 9, 'col_3': None}] df = pd.DataFrame(a) df['col_1'] = df['col_1'].fillna(0) df['col_2'] = df['col_2'].fillna(0) df['col_3'] = df['col_3'].fillna(0) print(df)
执行后输出:
name col_1 col_2 col_3 0 A 5.0 3.0 1.5 1 B 4.0 2.5 0.0 2 C 8.0 0.0 0.0 3 D 7.0 9.0 0.0
需求说明
现有尝试的一行代码仅对name为'A'和'B'的行有效,需补充完整逻辑:
- 若
col_3和col_2均为0,取col_1的25%(即col_1 * 0.25); - 对于
name为'D'的行,先取col_1和col_2的最小值,再按规则计算(col_3不为0则取col_3,否则取该最小值的25%)。
完整一行代码实现
df['col_4'] = [i if i != 0 else (min(x, y) * 0.25 if n == 'D' else (y * 0.25 if x == 0 else x * 0.25)) for i, x, y, n in zip(df['col_3'], df['col_2'], df['col_1'], df['name'])]
最终结果
执行上述代码后,df的结果为:
name col_1 col_2 col_3 col_4 0 A 5.0 3.0 1.5 1.50 1 B 4.0 2.5 0.0 0.625 2 C 8.0 0.0 0.0 2.00 3 D 7.0 9.0 0.0 1.75
逻辑说明
- 优先判断
col_3是否非0,满足则直接取col_3的值; - 若
col_3为0,判断是否是name='D'的行,是则取col_1和col_2最小值的25%; - 若不是D行,再判断
col_2是否为0,是则取col_1的25%,否则取col_2的25%。
内容的提问来源于stack exchange,提问作者LiAfe
相关产品推荐
相关产品推荐

