pandas入门问题:如何批量将Wife对应行移动到Husband行的下方
现有代码问题排查
- 你每次调用
append时都基于原始df操作,而非逐步累加的df1,会导致最终结果重复出现所有原始数据4次,完全不符合预期 - Pandas 2.0及以上版本已经废弃
append方法,官方推荐使用pd.concat实现数据拼接 - 你示例数据中存储身份的列名为
A,但代码中写的是Relationship,需要和实际列名对齐
正确实现方案
方案1:自定义优先级排序(推荐)
通过设置自定义排序规则,自动将所有行按「Husband → Wife → Kids → Cousin」的顺序排列,同时支持按B列分组后每组独立排序,完美匹配你的两个示例场景:
import pandas as pd df = pd.read_csv("Test.csv") # 定义排序优先级,数值越小排越靠前 sort_order = {"Husband": 1, "Wife": 2, "Kids": 3, "Cousin": 4} # 如果需要按B列(测试类型)分组,每组单独排序,用下面这行 df_result = df.groupby("B", group_keys=False).apply( lambda x: x.sort_values("A", key=lambda s: s.map(sort_order)) ).reset_index(drop=True) # 如果不需要分组,全表直接排序,替换为下面这行即可 # df_result = df.sort_values("A", key=lambda s: s.map(sort_order)).reset_index(drop=True) print(df_result)
方案2:筛选拼接(和你原有思路一致)
如果偏好你原本的分步筛选拼接逻辑,修改为正确的累加写法即可:
import pandas as pd df = pd.read_csv("Test.csv") df_result = pd.DataFrame() # 按需求顺序依次筛选拼接 for identity in ["Husband", "Wife", "Kids", "Cousin"]: df_result = pd.concat([df_result, df[df["A"] == identity]], ignore_index=True) print(df_result)
提示:如果你的实际数据中存储身份的列名是
Relationship,把上述代码中所有的"A"替换为"Relationship"即可。
内容的提问来源于stack exchange,提问作者junior21
相关产品推荐
相关产品推荐

