Python中按分组为DataFrame迭代追加历史B值生成C列的问题
解决Pandas按组累积拼接列值的问题
你需要按A列分组,对每个组内的B值进行从当前行向上的累积拼接生成C列对吧?我给你两个简洁高效的解决方案,都是直接贴合需求的:
方案一:用expanding窗口实现累积拼接
import pandas as pd # 构造你的原始DataFrame df = pd.DataFrame({ 'Date': ['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05'], 'A': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 'B': [0, 1, 0, 0, 0, 0, 1, 1] }) # 核心逻辑:按A分组后,对B列转字符串做累积拼接 df['C'] = df.groupby('A')['B'].apply( lambda x: x.astype(str).expanding().apply(lambda y: ''.join(y)) ).reset_index(level=0, drop=True) print(df)
代码说明
- 分组隔离:
groupby('A')把数据拆成独立的两组(A组和B组),避免跨组拼接; - 类型转换:把
B列的数值转成字符串,才能做拼接操作; - 累积窗口:
expanding()会为每一行生成包含从第一行到当前行的窗口,用''.join(y)把窗口内的所有字符串拼起来; - 索引对齐:
reset_index去掉分组带来的额外索引,让结果和原DataFrame完美匹配。
方案二:用列表推导式实现(更易读)
如果觉得嵌套lambda有点绕,也可以用这种更直观的写法:
df['C'] = df.groupby('A')['B'].transform( lambda x: [''.join(map(str, x[:i+1])) for i in range(len(x))] )
这个逻辑是对每个分组的B列,逐行生成从开头到当前行的拼接字符串,代码逻辑一眼就能看懂。
运行结果
两种方案都会输出你想要的目标DataFrame:
Date A B C 0 2015-01-01 A 0 0 1 2015-01-02 A 1 01 2 2015-01-03 A 0 010 3 2015-01-01 B 0 0 4 2015-01-02 B 0 00 5 2015-01-03 B 0 000 6 2015-01-04 B 1 0001 7 2015-01-05 B 1 00011
内容的提问来源于stack exchange,提问作者user2340706
相关产品推荐
相关产品推荐

