Python 基于多个因素计算发生次数
我有一个超过250列的数据框。大多数是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
线圈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