Python 如何基于唯一列值对数据帧行重新排序

Python 如何基于唯一列值对数据帧行重新排序,python,pandas,csv,Python,Pandas,Csv,我有一个示例test.csv文件,它被读取到一个数据帧中 >>> frame_values = dataframe['frame.number'].values >>> print(frame_values) [25355. 25148. 18371. 18403. 25134. 20875. 19244. 19227. 19022. 19221. nan 25356. 25149. 18372. 18404. 25135. 20876. 19245.

我有一个示例test.csv文件,它被读取到一个数据帧中

>>> frame_values = dataframe['frame.number'].values
>>> print(frame_values)
[25355. 25148. 18371. 18403. 25134. 20875. 19244. 19227. 19022. 19221.
    nan 25356. 25149. 18372. 18404. 25135. 20876. 19245. 19228. 19023.
 19222.]
它有20行7列

csv文件捕获有关SIP呼叫的信息,但每个呼叫的SIP消息顺序不正确。本例中有2个SIP调用,由一个空行分隔

我试图解决的问题是正确地重新排列sip消息

>>> dataframe = pd.read_csv('test.csv')
>>> print(dataframe)
    frame.number                           frame.time       ip.src       ip.dst                       sip.Call-ID sip.Method  sip.Status-Code
0        25355.0  May  9, 2019 15:57:01.433623000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e25a5083a8f2c85        ACK              NaN
1        25148.0  May  9, 2019 15:57:01.363890000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e25a5083a8f2c85        NaN            200.0
2        18371.0  May  9, 2019 15:56:59.411452000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e25a5083a8f2c85     INVITE              NaN
3        18403.0  May  9, 2019 15:56:59.421261000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e25a5083a8f2c85        NaN            100.0
4        25134.0  May  9, 2019 15:57:01.360769000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e25a5083a8f2c85        NaN            183.0
5        20875.0  May  9, 2019 15:57:00.064251000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e25a5083a8f2c85        NaN            180.0
6        19244.0  May  9, 2019 15:56:59.694785000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e25a5083a8f2c85        NaN            100.0
7        19227.0  May  9, 2019 15:56:59.690747000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e25a5083a8f2c85     INVITE              NaN
8        19022.0  May  9, 2019 15:56:59.620685000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e25a5083a8f2c85        NaN            407.0
9        19221.0  May  9, 2019 15:56:59.689779000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e25a5083a8f2c85        ACK              NaN
10           NaN                                  NaN          NaN          NaN                               NaN        NaN              NaN
11       25356.0  May  9, 2019 15:57:01.433623000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e234fs23osd9212        ACK              NaN
12       25149.0  May  9, 2019 15:57:01.363890000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e234fs23osd9212        NaN            200.0
13       18372.0  May  9, 2019 15:56:59.411452000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e234fs23osd9212     INVITE              NaN
14       18404.0  May  9, 2019 15:56:59.421261000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e234fs23osd9212        NaN            100.0
15       25135.0  May  9, 2019 15:57:01.360769000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e234fs23osd9212        NaN            183.0
16       20876.0  May  9, 2019 15:57:00.064251000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e234fs23osd9212        NaN            180.0
17       19245.0  May  9, 2019 15:56:59.694785000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e234fs23osd9212        NaN            100.0
18       19228.0  May  9, 2019 15:56:59.690747000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e234fs23osd9212     INVITE              NaN
19       19023.0  May  9, 2019 15:56:59.620685000 IST  55.55.55.55  44.44.44.44  0018506d493d00005e234fs23osd9212        NaN            407.0
20       19222.0  May  9, 2019 15:56:59.689779000 IST  44.44.44.44  55.55.55.55  0018506d493d00005e234fs23osd9212        ACK              NaN
在成功地对数据帧的行重新排序之后,我将插入一个新列并对调用进行分类

dataframe.insert(0, "Classified", " ")
如果SIP消息没有顺序,我就无法正确地对呼叫进行分类

我已经签出了pandassort\u index()sort\u values(),但这只对解决此问题的逻辑的一部分有所帮助

>>> dataframe.sort_values(by=['sip.Call-ID'], inplace=True)
这将根据sip.Call-ID列对csv文件进行排序。这些值对于每个SIP调用都是唯一的。因此,这允许将消息分组在一起

frame.number中的值应有助于解决此问题。但是,它们只能根据每个唯一的sip调用id进行排序,而不能作为一个整体进行排序,否则我们将有重叠的sip调用。我心目中的伪代码逻辑如下:

for each unique sip-call-id in dataframe:
    store it's related frame.number
    check if the next frame.number is smaller/bigger
    reorder rows based on condition above
我遇到的困难是访问每一行的索引,知道如何根据每个唯一的sip调用id对它们重新排序,并将这种重新排序应用于数据帧

>>> frame_values = dataframe['frame.number'].values
>>> print(frame_values)
[25355. 25148. 18371. 18403. 25134. 20875. 19244. 19227. 19022. 19221.
    nan 25356. 25149. 18372. 18404. 25135. 20876. 19245. 19228. 19023.
 19222.]
预期结果见下文。对于每个唯一的sip呼叫id,帧编号按升序排列,相关sip消息现在也按顺序排列。帧时间进一步说明了这一点,因为它们也是按升序排列的。这意味着SIP消息绝对是有序的

通过相关SIP消息,我的意思是SIP.Method&SIP.Status Code列现在已按顺序排列


  44.44.44.44             55.55.55.55
     |                        |
     |       INVITE           | First SIP Message: INVITE Method
     |----------------------->|
     |    100 trying          | Second SIP Message: 100 Status Code
     |<-----------------------|
     |    407 Proxy Auth      | Third SIP Message: 407 Status Code
     |<-----------------------|
     |                        |
     |         ACK            | Fourth SIP Message: ACK Method 
     |----------------------->|
     |         INVITE         | Fifth SIP Message: INVITE Method
     |----------------------->|
     |                        |
     |    100 trying          | Sixth SIP Message: 100 Status Code
     |<-----------------------|
     |    180 ringing         | Seventh SIP Message: 180 Status Code
     |<-----------------------|
     |    183 session         | Eight SIP Message: 183 Status Code
     |<-----------------------|
     |       200 OK           | Ninth SIP Message: 200 Status Code
     |<-----------------------|
     |         ACK            | Tenth SIP Message: ACK Method 
     |----------------------->|

如果我理解正确,您希望按
'sip.Call ID'
排序,然后按
'frame.time'
排序?谢谢您的回复。你可以说这就是我要找的。不过为了更清楚,以防万一,第一个数据帧输出已经按
sip.Call ID
排序。
sip.Call ID
列需要保持原样。唯一需要更改的是每行对每个唯一sip呼叫id的排序。使用排序
'frame.time'
值将按顺序获得sip消息。数据帧的最后一个输出正是我所需要的输出。希望这能让你更清楚。你可以按多列排序,它会按你列出的优先级排序。例如.df.sort_值(按=['sip.Call ID','frame.time'])很棒的东西,它为我正确地排序了。我没有意识到它把它作为优先级(我之前做了相反的['frame.time','sip.Call ID',我认为它根本不起作用)。我看过最新的文档,但我不记得它提到了任何关于优先级的内容。现在,这将解除我的障碍,非常感谢@Benpapi如果我理解正确,您希望按
'sip.Call ID'
排序,然后按
'frame.time'
排序?谢谢您的回复。你可以说这就是我要找的。不过为了更清楚,以防万一,第一个数据帧输出已经按
sip.Call ID
排序。
sip.Call ID
列需要保持原样。唯一需要更改的是每行对每个唯一sip呼叫id的排序。使用排序
'frame.time'
值将按顺序获得sip消息。数据帧的最后一个输出正是我所需要的输出。希望这能让你更清楚。你可以按多列排序,它会按你列出的优先级排序。例如.df.sort_值(按=['sip.Call ID','frame.time'])很棒的东西,它为我正确地排序了。我没有意识到它把它作为优先级(我之前做了相反的['frame.time','sip.Call ID',我认为它根本不起作用)。我看过最新的文档,但我不记得它提到了任何关于优先级的内容。现在,这将解除我的障碍,非常感谢@本帕普