如何对比DataFrame中的值并将条件应用到新DataFrame?——合并相同MOL对应SIN字段的需求实现
按MOL分组合并SIN并生成指定结构DataFrame的解决方案
没问题,我来帮你搞定这个DataFrame的处理需求!我们可以通过分组聚合+构造新表的两步法来实现你的要求,下面是具体的步骤和代码:
步骤1:按MOL分组并合并对应SIN值
首先,我们需要把原DataFrame中相同MOL值的SIN用逗号连接起来。这里可以用pandas的groupby配合agg方法来完成分组聚合:
import pandas as pd # 构造原DataFrame data = { 'SIN': [339940, 322291, 321234], 'MOL': [250000, 250000, 850000] } df = pd.DataFrame(data) # 按MOL分组,将每组的SIN用逗号连接 grouped = df.groupby('MOL')['SIN'].agg(','.join).reset_index()
这一步执行后,grouped会得到一个包含两列的中间DataFrame:
| MOL | SIN |
|---|---|
| 250000 | 339940,322291 |
| 850000 | 321234 |
步骤2:构造目标结构的新DataFrame
接下来,我们需要把分组后的结果转换成你需要的SIN1、SIN2、MOL1、MOL2结构。由于示例中只有两个不同的MOL组,我们可以直接提取分组结果并构造新表:
# 提取分组后的结果列表 group_list = grouped.values.tolist() # 构造目标DataFrame df1 df1 = pd.DataFrame({ 'SIN1': [group_list[0][1]], 'SIN2': [group_list[1][1]], 'MOL1': [group_list[0][0]], 'MOL2': [group_list[1][0]] })
执行后df1的结果就和你给出的示例完全一致了:
| SIN1 | SIN2 | MOL1 | MOL2 |
|---|---|---|---|
| 339940,322291 | 321234 | 250000 | 850000 |
扩展:如果有多个不同MOL值的情况
如果你的原DataFrame中有更多不同的MOL组,想要把每个组的合并结果依次作为列(比如SIN1、SIN2、SIN3...),可以用pandas的转置或透视功能来生成宽表:
# 给分组后的结果添加序号列 grouped['sin_col'] = ['SIN' + str(i+1) for i in range(len(grouped))] grouped['mol_col'] = ['MOL' + str(i+1) for i in range(len(grouped))] # 分别生成SIN和MOL的宽表 sin_wide = grouped.pivot(columns='sin_col', values='SIN').reset_index(drop=True) mol_wide = grouped.pivot(columns='mol_col', values='MOL').reset_index(drop=True) # 合并成最终表 df1_extended = pd.concat([sin_wide, mol_wide], axis=1)
这样不管有多少个MOL组,都能自动生成对应的SIN和MOL列啦!
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

