如何使用Python Pandas联接其他表并计数?

0 投票
2 回答
54 浏览
提问于 2025-04-14 17:48

这是我的代码

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)

这是它的输出,但不是我想要的结果。

这里放图片描述

我想要的输出是这个:

这里放图片描述

2 个回答

0

你可以使用pivot(配合groupby.cumcount)来处理数据,然后用join把结果和groupby.size的输出结合起来。

from string import ascii_uppercase

# fix your reference
# extract is more efficient than split
df['Pin ref.new'] = df['Pin ref.new'].str.extract(r'(^[^.]+)', expand=False)

# set up grouper
g = df.groupby('Pin ref.new')

# pivot, rename columns, add the counts
out = (df.assign(col=g.cumcount())
         .pivot(index='Pin ref.new', columns='col', values='NET')
         .rename(columns=lambda x: f'NET{ascii_uppercase[x]}')
         .join(g.size().rename('count'))
         .reset_index()
      )

注意:ascii_uppercase可以把列的数字转换成字母,但你最多只能处理26列,如果需要更多,请说明具体的逻辑。

输出结果:

  Pin ref.new              NETA               NETB  count
0          C1          P3V3_AUX                GND      2
1       C1102          P3V3_AUX                GND      2
2          C2          P3V3_AUX                GND      2
3        PC17  P48V_2_ADMHS_VCC  P48V_2_ADMHS_AGND      2
0

代码

# your code
df['Pin ref.new'] = df['Pin ref.new'].str.split('.').str[0]

# process
out = (df.assign(cc=df.groupby('Pin ref.new').cumcount())
       .pivot(index='Pin ref.new', columns='cc', values='NET')
       .rename(lambda x: 'NET' + chr(x + 65), axis=1)
       .assign(count=lambda x: x.count(axis=1))
       .sort_index(axis=1, key=lambda x: x.map({'count': 1}))
       .reset_index().rename_axis(None, axis=1)
)

输出:

  Pin ref.new  count              NETA               NETB
0          C1      2          P3V3_AUX                GND
1       C1102      2          P3V3_AUX                GND
2          C2      2          P3V3_AUX                GND
3        PC17      2  P48V_2_ADMHS_VCC  P48V_2_ADMHS_AGND

如果所有的计数只有两个,使用下面的代码:

out = (df.groupby('Pin ref.new')['NET']
       .agg(count='count', NETA='first', NETB='last')
       .reset_index()
)

撰写回答