如何使用Python Pandas实现表关联与统计?代码输出修正需求
Pandas处理引脚与网络数据:修正表关联与统计逻辑
我用以下Pandas代码处理引脚与网络数据,但输出不符合预期,期望得到特定格式的配对统计结果。
现有代码:
import pandas as pd data = { 'NET': ['P3V3_AUX', 'GND', 'P3V3_AUX', 'GND', 'P3V3_AUX', 'GND', 'P48V_2_ADMHS_VCC', 'P48V_2_ADMHS_AGND'], 'Pin ref.new': ['C1.1', 'C1.2', 'C1102.1', 'C1102.2', 'C2.1', 'C2.2', 'PC17.1', 'PC17.2'] } df = pd.DataFrame(data) df['Pin ref.new'] = df['Pin ref.new'].str.split('.').str[0] result = df.groupby(['Pin ref.new', 'NET']).size().reset_index(name='count') result.rename(columns={'Pin ref.new': 'Pin ref.new', 'NET': 'NETA'}, inplace=True) result['NETB'] = result['NETA'].shift(-1) result = result.iloc[:-1] print(df) print(result)
当前问题:原代码用shift(-1)会跨引脚组关联NET,导致错误配对(比如C2的GND和PC17的P48V_2_ADMHS_VCC被错误关联),实际需要每个引脚组内部的两个NET进行配对,同时保留引脚标识和统计数量。
期望输出格式:
| Pin ref.new | NETA | NETB | count |
|---|---|---|---|
| C1 | P3V3_AUX | GND | 1 |
| C1102 | P3V3_AUX | GND | 1 |
| C2 | P3V3_AUX | GND | 1 |
| PC17 | P48V_2_ADMHS_VCC | P48V_2_ADMHS_AGND | 1 |
解决方案
核心是按引脚分组后,在每组内部提取两个NET作为NETA和NETB,而非全局移位。以下两种方法均可实现:
方法1:分组聚合处理
import pandas as pd data = { 'NET': ['P3V3_AUX', 'GND', 'P3V3_AUX', 'GND', 'P3V3_AUX', 'GND', 'P48V_2_ADMHS_VCC', 'P48V_2_ADMHS_AGND'], 'Pin ref.new': ['C1.1', 'C1.2', 'C1102.1', 'C1102.2', 'C2.1', 'C2.2', 'PC17.1', 'PC17.2'] } df = pd.DataFrame(data) # 处理引脚标识,去除后缀 df['Pin ref.new'] = df['Pin ref.new'].str.split('.').str[0] # 按引脚分组,提取每组的两个NET作为配对,count设为1 result = df.groupby('Pin ref.new').agg( NETA=('NET', lambda x: x.iloc[0]), NETB=('NET', lambda x: x.iloc[1]), count=('NET', lambda x: 1) ).reset_index() print(result)
方法2:Pivot转置(适合每组固定2个NET的场景)
import pandas as pd data = { 'NET': ['P3V3_AUX', 'GND', 'P3V3_AUX', 'GND', 'P3V3_AUX', 'GND', 'P48V_2_ADMHS_VCC', 'P48V_2_ADMHS_AGND'], 'Pin ref.new': ['C1.1', 'C1.2', 'C1102.1', 'C1102.2', 'C2.1', 'C2.2', 'PC17.1', 'PC17.2'] } df = pd.DataFrame(data) df['Pin ref.new'] = df['Pin ref.new'].str.split('.').str[0] # 给每组内的NET添加序号(0和1) df['net_idx'] = df.groupby('Pin ref.new').cumcount() # 转置为宽表,重命名列并添加count result = df.pivot(index='Pin ref.new', columns='net_idx', values='NET').reset_index() result.columns = ['Pin ref.new', 'NETA', 'NETB'] result['count'] = 1 print(result)
代码说明
- 两种方法均先统一引脚标识,去除
.数字后缀; - 方法1通过分组聚合直接提取每组内的两个NET完成配对,count设为1(每组对应一对NET);
- 方法2先给组内NET添加序号,再通过转置实现列配对,逻辑更直观。
运行后即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者Hsien
相关产品推荐
相关产品推荐

