按分组和列值对Pandas DataFrame行进行条件合并
Pandas分组后按规则合并列值
给定如下Pandas DataFrame,需按GROUP分组后,对每列执行规则:若组内存在1或0则保留该值(1和0优先级相同,若同时存在两种值,优先取1),否则保留-1。
原始数据
import pandas as pd df = pd.DataFrame({'GROUP':['A1', 'A1', 'B2', 'B2', 'B2', 'C3', 'C3'], 'X':[1, -1, -1, 1, -1, -1, 1], 'Y': [-1, 0, 1, -1, -1, -1, -1], 'Z': [-1, -1, -1, -1, 0, 1, -1]})
原始DataFrame展示:
GROUP X Y Z 0 A1 1 -1 -1 1 A1 -1 0 -1 2 B2 -1 1 -1 3 B2 1 -1 -1 4 B2 -1 -1 0 5 C3 -1 -1 1 6 C3 1 -1 -1
方法一:缺失值替换+最大值聚合
通过将-1替换为缺失值,利用最大值聚合的特性(1>0>缺失值)快速实现规则,逻辑简洁高效:
# 替换-1为缺失值,分组取最大值,恢复-1并转换数值类型 result = df.replace(-1, pd.NA).groupby('GROUP').agg('max').reset_index().fillna(-1) result[['X', 'Y', 'Z']] = result[['X', 'Y', 'Z']].astype(int) print(result)
输出结果:
GROUP X Y Z 0 A1 1 0 -1 1 B2 1 1 0 2 C3 1 -1 1
方法二:自定义聚合函数
如果需要更直观的逻辑控制,可以自定义函数逐个检查组内值:
def get_target_value(col): if 1 in col.values: return 1 elif 0 in col.values: return 0 else: return -1 # 分组应用自定义函数 result = df.groupby('GROUP').agg(get_target_value).reset_index() print(result)
输出结果与方法一完全一致。
内容的提问来源于stack exchange,提问作者Zara
相关产品推荐
相关产品推荐

