Python 如何基于唯一列值对数据帧行重新排序
我有一个示例test.csv文件,它被读取到一个数据帧中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.
>>> 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',我认为它根本不起作用)。我看过最新的文档,但我不记得它提到了任何关于优先级的内容。现在,这将解除我的障碍,非常感谢@本帕普