首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按DataFrame中的序列分组

如何按DataFrame中的序列分组
EN

Stack Overflow用户
提问于 2020-01-13 12:41:05
回答 2查看 103关注 0票数 1

这是我的输入:

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame(np.array([[1, 0.0, "192.168.1.1" ,"192.168.1.2", "UDP" , 64], 
                                      [2, 0.2, "192.168.1.1" ,"192.168.1.3", "UDP" , 64],
                                      [3, 0.8, "192.168.1.1" ,"192.168.1.4", "UDP" , 64],
                                      [4, 1.01, "192.168.1.1" ,"192.168.1.2", "ARP" , 64],
                                     [5, 1.23, "192.168.1.1" ,"192.168.1.3", "UDP" , 64],
                                     [6, 1.44, "192.168.1.1" ,"192.168.1.4", "UDP" , 64],
                                     [7, 1.90, "192.168.1.1" ,"192.168.1.2", "ARP" , 64],
                                     [8, 2.05, "192.168.1.1" ,"192.168.1.3", "UDP" , 64],
                                     [9, 2.3, "192.168.1.1" ,"192.168.1.4", "UDP" , 64],
                                     [10, 2.5, "192.168.1.1" ,"192.168.1.2", "UDP" , 64],
                                     [11, 2.67, "192.168.1.1" ,"192.168.1.3", "ARP" , 64]]),
                            columns=['No.', 'Time','Source', 'Destination', 'Protocol', 'Length'],
                            index =['0', '1', '2','3','4','5','6','7','8','9','10'])

这是输出:

代码语言:javascript
复制
    No. Time    Source      Destination Protocol    Length
0   1   0.0     192.168.1.1 192.168.1.2 UDP           64
1   2   0.2     192.168.1.1 192.168.1.3 UDP           64
2   3   0.8     192.168.1.1 192.168.1.4 UDP           64
3   4   1.01    192.168.1.1 192.168.1.2 ARP           64
4   5   1.23    192.168.1.1 192.168.1.3 UDP           64
5   6   1.44    192.168.1.1 192.168.1.4 UDP           64
6   7   1.9     192.168.1.1 192.168.1.2 ARP           64
7   8   2.05    192.168.1.1 192.168.1.3 UDP           64
8   9   2.3     192.168.1.1 192.168.1.4 UDP           64
9  10   2,5     192.168.1.1 192.168.1.2 UDP           64
10 11   2,67    192.168.1.1 192.168.1.3 ARP           64

现在,我想按协议"ARP“对输入进行分组。每次ARP协议出现在数据中时,都应该出现一个序列。

这就是我想要的:

代码语言:javascript
复制
Secquence   No. Time      Source        Destination Protocol    Length
             1  0.0      192.168.1.1    192.168.1.2 UDP           64
             2  0.2      192.168.1.1    192.168.1.3 UDP           64
             3  0.8      192.168.1.1    192.168.1.4 UDP           64
1            4  1.01     192.168.1.1    192.168.1.2 ARP           64
             5  1.23     192.168.1.1    192.168.1.3 UDP           64
             6  1.44     192.168.1.1    192.168.1.4 UDP           64
2            7  1.9      192.168.1.1    192.168.1.2 ARP           64
             8  2.05     192.168.1.1    192.168.1.3 UDP           64
             9  2.3      192.168.1.1    192.168.1.4 UDP           64
            10   2,5     192.168.1.1    192.168.1.2 UDP           64
3           11  2,67     192.168.1.1    192.168.1.3 ARP           64
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-13 13:26:56

使用loc结合条件和cumcount

代码语言:javascript
复制
cond = df.Protocol == 'ARP'
df.loc[cond, 'Sequence'] = df[cond].groupby('Protocol').cumcount() + 1

print(df)
   No.  Time       Source  Destination Protocol Length   Sequence
0    1   0.0  192.168.1.1  192.168.1.2      UDP     64        NaN
1    2   0.2  192.168.1.1  192.168.1.3      UDP     64        NaN
2    3   0.8  192.168.1.1  192.168.1.4      UDP     64        NaN
3    4  1.01  192.168.1.1  192.168.1.2      ARP     64        1.0
4    5  1.23  192.168.1.1  192.168.1.3      UDP     64        NaN
5    6  1.44  192.168.1.1  192.168.1.4      UDP     64        NaN
6    7   1.9  192.168.1.1  192.168.1.2      ARP     64        2.0
7    8  2.05  192.168.1.1  192.168.1.3      UDP     64        NaN
8    9   2.3  192.168.1.1  192.168.1.4      UDP     64        NaN
9   10   2.5  192.168.1.1  192.168.1.2      UDP     64        NaN
10  11  2.67  192.168.1.1  192.168.1.3      ARP     64        3.0

如果要用NaN更改''值并重新排列列,

代码语言:javascript
复制
df.loc[df.Sequence.isnull(), 'Sequence'] = ''

cols = df.columns.tolist()
cols = cols[-1:] + cols[:-1]

print(df[cols])

   Sequence  No.  Time       Source  Destination Protocol Length
0              1   0.0  192.168.1.1  192.168.1.2      UDP     64
1              2   0.2  192.168.1.1  192.168.1.3      UDP     64
2              3   0.8  192.168.1.1  192.168.1.4      UDP     64
3          1   4  1.01  192.168.1.1  192.168.1.2      ARP     64
4              5  1.23  192.168.1.1  192.168.1.3      UDP     64
5              6  1.44  192.168.1.1  192.168.1.4      UDP     64
6          2   7   1.9  192.168.1.1  192.168.1.2      ARP     64
7              8  2.05  192.168.1.1  192.168.1.3      UDP     64
8              9   2.3  192.168.1.1  192.168.1.4      UDP     64
9             10   2.5  192.168.1.1  192.168.1.2      UDP     64
10         3  11  2.67  192.168.1.1  192.168.1.3      ARP     64
票数 2
EN

Stack Overflow用户

发布于 2020-01-13 13:49:57

如果不想要NA值,也可以使用df.dropna(subset= ['Secquence'])df[pd.notnull(df['Secquence'])],但是只有行,其中Secqeunce列的值不是数据格式中的NaN。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59716862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档