如何使用Pandas循环对DataFrame列进行排序与分组拼接
问题与解决方案
原始数据与目标格式
原始DataFrame
| Area | Sequence | X | Y |
|---|---|---|---|
| A | 2 | 604582.25 | 320710 |
| A | 1 | 604590.25 | 320704.75 |
| A | 3 | 604579.25 | 320710 |
| B | 2 | 536584.47 | 176977.83 |
| B | 1 | 536570 | 176996.43 |
| C | 1 | 509202.13 | 307995.99 |
| C | 2 | 509205.3 | 307951.24 |
目标DataFrame
| Area | XY_by_sequence |
|---|---|
| A | 604590.25 320704.75 , 604582.25 320710 , 604579.25 320710 |
| B | 536570 176996.43 , 536584.47 176977.83 |
| C | 509202.13 307995.99 , 509205.3 307951.24 |
循环实现方法
按照要求,使用循环完成排序与分组的步骤如下:
- 先对原始数据按
Area和Sequence升序排序,确保每个区域内的记录按序号排列 - 提取所有唯一的
Area值,逐个遍历 - 针对每个
Area,筛选出对应行,将每行的X、Y值拼接为字符串,再用,连接所有行的拼接结果 - 收集所有区域的结果,转换为目标格式的DataFrame
代码实现:
import pandas as pd # 构造原始数据 df1 = pd.DataFrame({ 'Area': ['A', 'A', 'A', 'B', 'B', 'C', 'C'], 'Sequence': [2, 1, 3, 2, 1, 1, 2], 'X': [604582.25, 604590.25, 604579.25, 536584.47, 536570, 509202.13, 509205.3], 'Y': [320710, 320704.75, 320710, 176977.83, 176996.43, 307995.99, 307951.24] }) # 排序:先按Area,再按Sequence升序 df_sorted = df1.sort_values(by=['Area', 'Sequence']) # 初始化结果列表 result = [] # 遍历每个唯一Area for area in df_sorted['Area'].unique(): # 获取当前Area的所有行 subset = df_sorted[df_sorted['Area'] == area] # 拼接每行的X和Y,再合并成一个字符串 xy_combined = ' , '.join([f"{row['X']} {row['Y']}" for _, row in subset.iterrows()]) # 添加到结果列表 result.append({'Area': area, 'XY_by_sequence': xy_combined}) # 转换为目标DataFrame df_result = pd.DataFrame(result) print(df_result)
更高效的非循环实现(推荐)
如果没有强制要求使用循环,Pandas的分组聚合方法更简洁且性能更优:
import pandas as pd df1 = pd.DataFrame({ 'Area': ['A', 'A', 'A', 'B', 'B', 'C', 'C'], 'Sequence': [2, 1, 3, 2, 1, 1, 2], 'X': [604582.25, 604590.25, 604579.25, 536584.47, 536570, 509202.13, 509205.3], 'Y': [320710, 320704.75, 320710, 176977.83, 176996.43, 307995.99, 307951.24] }) # 排序后分组聚合 df_result = (df1.sort_values(by=['Area', 'Sequence']) .groupby('Area') .apply(lambda grp: ' , '.join([f"{x} {y}" for x, y in zip(grp['X'], grp['Y'])])) .reset_index(name='XY_by_sequence')) print(df_result)
内容的提问来源于stack exchange,提问作者Vivek kanna Jayaprakash
相关产品推荐
相关产品推荐

