Python 基于多个因素计算发生次数

Python 基于多个因素计算发生次数,python,pandas,dataframe,aggregate,Python,Pandas,Dataframe,Aggregate,我有一个超过250列的数据框。大多数是线圈35;或寄存器35;的增量,并具有src和dst的组合。我想计算src和dst的每个组合在该行中至少显示一个1的次数。同时也计算它是寄存器还是线圈 示例数据帧: srcmacaddr dstmacaddr coil_0 coil_1 coil_2 register_0 register_1 register_2 00-11-2a-3b-4c-5d 22-33-6e-7f-8g-9h 0 1

我有一个超过250列的数据框。大多数是
线圈35;
寄存器35;
的增量,并具有
src
dst
的组合。我想计算
src
dst
的每个组合在该行中至少显示一个
1
的次数。同时也计算它是
寄存器
还是
线圈

示例数据帧:

srcmacaddr          dstmacaddr         coil_0   coil_1  coil_2  register_0 register_1 register_2
00-11-2a-3b-4c-5d   22-33-6e-7f-8g-9h   0        1       0       0           NaN       0       
22-33-6e-7f-8g-9h   00-11-2a-3b-4c-5d   0        1       0       0           1         1       
00-11-2a-3b-4c-5d   00-99-5d-4c-3b-2a   NaN      NaN     NaN     NaN         NaN       NaN       
00-99-5d-4c-3b-2a   22-33-6e-7f-8g-9h   0        0       0       0           0         0       
22-33-6e-7f-8g-9h   00-11-2a-3b-4c-5d   1        1       1       1           1         1
00-11-2a-3b-4c-5d   00-99-5d-4c-3b-2a   NaN      NaN     NaN     1           1         1
00-99-5d-4c-3b-2a   00-11-2a-3b-4c-5d   0        0       0       0           0         0
所需输出示例:

srcmacaddr          dstmacaddr         Coil or Reg    Coil   Reg
00-11-2a-3b-4c-5d   22-33-6e-7f-8g-9h   1              1      0
22-33-6e-7f-8g-9h   00-11-2a-3b-4c-5d   2              2      2
00-11-2a-3b-4c-5d   00-99-5d-4c-3b-2a   1              0      1
00-99-5d-4c-3b-2a   22-33-6e-7f-8g-9h   0              0      0
编辑:

所需输出样本(计数0):

采样所需输出(计数1或0):


首先按前两列聚合
sum
,然后按前两列的名称聚合
max
,然后添加由随机值填充的列:

df1 = df.groupby(['srcmacaddr','dstmacaddr'], sort=False).sum().astype(int)
df1 = df1.groupby(lambda x: x.split('_')[0], axis=1).max()

m = np.random.randint(2, size=len(df1)) == 1
df1.insert(0, 'Coil or Reg', np.where(m, df1['coil'], df1['register']))
df1 = df1.reset_index()
print (df1)
          srcmacaddr         dstmacaddr  Coil or Reg  coil  register
0  00-11-2a-3b-4c-5d  22-33-6e-7f-8g-9h            0     1         0
1  22-33-6e-7f-8g-9h  00-11-2a-3b-4c-5d            2     2         2
2  00-11-2a-3b-4c-5d  00-99-5d-4c-3b-2a            1     0         1
3  00-99-5d-4c-3b-2a  22-33-6e-7f-8g-9h            0     0         0

首先按前两列聚合
sum
,然后按前两列的名称聚合
max
,然后添加由随机值填充的列:

df1 = df.groupby(['srcmacaddr','dstmacaddr'], sort=False).sum().astype(int)
df1 = df1.groupby(lambda x: x.split('_')[0], axis=1).max()

m = np.random.randint(2, size=len(df1)) == 1
df1.insert(0, 'Coil or Reg', np.where(m, df1['coil'], df1['register']))
df1 = df1.reset_index()
print (df1)
          srcmacaddr         dstmacaddr  Coil or Reg  coil  register
0  00-11-2a-3b-4c-5d  22-33-6e-7f-8g-9h            0     1         0
1  22-33-6e-7f-8g-9h  00-11-2a-3b-4c-5d            2     2         2
2  00-11-2a-3b-4c-5d  00-99-5d-4c-3b-2a            1     0         1
3  00-99-5d-4c-3b-2a  22-33-6e-7f-8g-9h            0     0         0

22-33-6e-7f-8g-9h
是如何变成2,2,2的。我只看到一个线圈和两个寄存器。我刚检查过。它的2,2,2代表
22-33-6e-7f-8g-9h
22-33-6e-7f-8g-9h是如何变成2,2,2的。我只看到一个线圈和两个寄存器。我刚检查过。它的2,2,2代表
22-33-6e-7f-8g-9h
是否有办法在行中填充的1,0或1&0之间反弹@jezrael@jezraelI-我已编辑了我的问题以给出一个示例。我可以在聊天中问你几个问题吗?我找不到你的电子邮件。向你发送了一封电子邮件,如果你收到了,请告诉我。是否有办法在行中填充的1,0或1&0之间跳转@jezrael@jezraelI-我已经编辑了我的问题以给出一个示例。我可以在聊天中问你几个问题吗?我找不到你的电子邮件。我给你发了一封电子邮件,如果你收到了,请告诉我。
df1 = df.groupby(['srcmacaddr','dstmacaddr'], sort=False).sum().astype(int)
df1 = df1.groupby(lambda x: x.split('_')[0], axis=1).max()

m = np.random.randint(2, size=len(df1)) == 1
df1.insert(0, 'Coil or Reg', np.where(m, df1['coil'], df1['register']))
df1 = df1.reset_index()
print (df1)
          srcmacaddr         dstmacaddr  Coil or Reg  coil  register
0  00-11-2a-3b-4c-5d  22-33-6e-7f-8g-9h            0     1         0
1  22-33-6e-7f-8g-9h  00-11-2a-3b-4c-5d            2     2         2
2  00-11-2a-3b-4c-5d  00-99-5d-4c-3b-2a            1     0         1
3  00-99-5d-4c-3b-2a  22-33-6e-7f-8g-9h            0     0         0