如何使用Python 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)
这是它的输出,但不是我想要的结果。

我想要的输出是这个:

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()
)