You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 标记纯数字行:通过pd.to_numeric尝试转换Column A,转换成功的即为纯数字行
  2. 生成分组键:对非纯数字行,比较当前行与上一行的Column B是否一致,生成连续分组的标识
  3. 合并分组:对每个连续分组,用逗号连接Column A,保留分组首行的Column B、Column C和原始索引
  4. 合并结果:将处理后的非纯数字行和纯数字行合并,按原始索引排序得到最终结果

内容的提问来源于stack exchange,提问作者KRANTHI KUMAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:57:25