DataFrame列遍历合并:按规则合并Column A并保留纯数字行
Pandas:合并非纯数字行并保留纯数字行
问题背景
现有一个包含1万+行的Pandas DataFrame,数据结构如下:
import pandas as pd data = { 'Column A': ['A11', 'A18', 'B11', 'B18', 'C11', 'C18', 'A2', 'A3', 'A1', 'A2', 'A11', 'A18', 'A26', 'A27', '2', '3', '3', 'C18', 'C43', 'A11', 'A18'], 'Column B': [1800, 1800, 1800, 1800, 1800, 1800, 2100, 2100, 2100, 2100, 1800, 1800, 2600, 2600, 2400, 800, 800, 2100, 800, 1800, 1800], 'Column C': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 28, 23, 24, 32, 42, 12, 98] } df = pd.DataFrame(data)
原始数据预览:
Column A Column B Column C 0 A11 1800 1 1 A18 1800 2 2 B11 1800 3 3 B18 1800 4 4 C11 1800 5 5 C18 1800 6 6 A2 2100 7 7 A3 2100 8 8 A1 2100 9 9 A2 2100 10 10 A11 1800 11 11 A18 1800 12 12 A26 2600 13 13 A27 2600 14 14 2 2400 28 15 3 800 23 16 3 800 24 17 C18 2100 32 18 C43 800 42 19 A11 1800 12 20 A18 1800 98
期望输出
需要得到如下结果:
Column A Column B Column C 0 A11,A18 1800 1 2 B11,B18 1800 3 4 C11,C18 1800 5 6 A2,A3,A1,A2 2100 7 10 A11,A18 1800 11 12 A26,A27 2600 13 14 2 2400 28 15 3 800 23 16 3 800 24 17 C18 2100 32 18 C43 800 42 19 A11,A18 1800 12
规则说明
- 若
Column A的值为纯数字,保留所有对应行,不做合并 - 仅合并连续的、
Column B值相同的非纯数字Column A行:将组内Column A用逗号连接,保留组内第一行的Column C和索引,删除组内其他冗余行
解决方案
import pandas as pd # 标记纯数字行 df['is_numeric'] = pd.to_numeric(df['Column A'], errors='coerce').notna() # 处理非纯数字行的分组 non_numeric = df[~df['is_numeric']].copy() # 生成连续相同Column B的分组键 non_numeric['group'] = (non_numeric['Column B'] != non_numeric['Column B'].shift()).cumsum() # 合并非纯数字分组:连接Column A,保留组内首行的Column B、Column C和原始索引 merged_non_numeric = non_numeric.groupby('group').agg( **{ 'Column A': ('Column A', ','.join), 'Column B': ('Column B', 'first'), 'Column C': ('Column C', 'first') } ) merged_non_numeric.index = non_numeric.groupby('group').apply(lambda x: x.index[0]) # 提取纯数字行 numeric_rows = df[df['is_numeric']].drop('is_numeric', axis=1) # 合并结果并按原始索引排序 result = pd.concat([merged_non_numeric, numeric_rows]).sort_index() # 查看结果 print(result)
代码说明
- 标记纯数字行:通过
pd.to_numeric尝试转换Column A,转换成功的即为纯数字行 - 生成分组键:对非纯数字行,比较当前行与上一行的
Column B是否一致,生成连续分组的标识 - 合并分组:对每个连续分组,用逗号连接
Column A,保留分组首行的Column B、Column C和原始索引 - 合并结果:将处理后的非纯数字行和纯数字行合并,按原始索引排序得到最终结果
内容的提问来源于stack exchange,提问作者KRANTHI KUMAR
相关产品推荐
相关产品推荐

