pandas按条件groupby拼接:非空class对应分组Name合并问题
问题原因分析
你写的代码出现长度不匹配的核心原因是groupby.apply返回的结果长度等于分组数量(你的示例里是2组),而你赋值的左侧是原DataFrame中class非空的行,两者索引无法对齐,因此赋值失败。
正确实现代码
第一步:构造测试数据
import pandas as pd df = pd.DataFrame({ "Name": ["kumar", "ram", "ravi", "tej", "om"], "class": ["", "10", "", "", "12"], "score": ["", "14", "", "", "15"] })
第二步:按规则分组并聚合
你之前创建分组列g1的逻辑是正确的,遇到非空class就累加分组编号,每个分组正好覆盖从上个非空class之后到当前非空class的所有行,后续直接对分组聚合即可:
# 生成分组编号 df["g1"] = df["class"].ne("").cumsum() # 分组聚合:Name拼接,class和score取每组的非空值 result = df.groupby("g1", as_index=False).agg( Name=("Name", "".join), class_=("class", "max"), score=("score", "max") ).rename(columns={"class_": "class"}).drop(columns="g1")
输出结果
打印result即可得到你需要的目标格式:
Name class score 0 kumarram 10 14 1 ravit ejom 12 15
补充说明
如果你的数据中空值是NaN而不是空字符串"",只需要把df["class"].ne("")替换为df["class"].notna()即可。
内容的提问来源于stack exchange,提问作者Pyd
相关产品推荐
相关产品推荐

