Pandas按指定列分组合并多行、行内去重并填充空值实现方案
pandas 实现代码
import pandas as pd import numpy as np # 构造初始DataFrame df1 = pd.DataFrame( { "day": ["monday", "monday","Tuesday" ], "column0": ["xx", "xx", ""], "column1": ["yy", "aa", "bb"], "column2": ["cc", "cc", "cc"], "column3": ["cc", "", "aa"] } ) # ---------------------- 第一步:按day分组合并为单行,得到第一次处理结果 ---------------------- def merge_group(group): # 拼接组内原行索引为字符串 index_col = ','.join(group.index.astype(str).tolist()) # 拉平组内所有列(除day列)的值 flatten_values = group.drop(columns='day').values.flatten().tolist() return pd.Series([group.name, index_col] + flatten_values) # 分组聚合得到第一次处理结果 first_result = df1.groupby('day', as_index=False).apply(merge_group).reset_index(drop=True) # 重命名列名 first_result.columns = ['day', 'index'] + [f'column{i}' for i in range(len(first_result.columns)-2)] # 第一次处理结果可直接打印first_result查看,和你预期的第一次输出一致 # ---------------------- 第二步:行内去重、空值替换为NAN ---------------------- def row_deduplication(row): existed = set() new_row = [] for val in row: # 空字符串直接替换为NAN if val == '': new_row.append(np.nan) continue # 重复值替换为NAN if val in existed: new_row.append(np.nan) else: existed.add(val) new_row.append(val) return pd.Series(new_row, index=row.index) final_result = first_result.copy() # 仅对数值列做去重处理,day和index列保留原内容 value_cols = [col for col in final_result.columns if col not in ['day', 'index']] final_result[value_cols] = final_result[value_cols].apply(row_deduplication, axis=1) # 删除全为NAN的空列 final_result = final_result.dropna(axis=1, how='all') # 可选:如果需要把NAN显示为字符串'NAN'和示例对齐,保留下面这行,不需要可删除 final_result = final_result.fillna('NAN') # 打印最终结果 print(final_result)
内容的提问来源于stack exchange,提问作者xavi
相关产品推荐
相关产品推荐

