2017-04-14 33 views
2

我有一個ip數據包作爲CSV文件,我嘗試從信息字段中提取序列號到一個單獨的列,只有序列號。序列號是信息字符串中間的子字符串。所以這裏是我的原始代碼。首先,我爲序列號創建一個新列,然後檢查信息字段是否包含Seq編號,然後分割信息字段,以便只顯示序列號。如果我在'Seq = j.split ...'後打印,我確實得到了正確的值。我如何將它寫入CSV文件Seq列?將數據複製到Python /熊貓中的另一列

file = pd.read_csv(file.csv) 

file['Seq'] = None 
for i in file['Info']: 
    if 'Seq' in i: 
     split = i.split(' ') 
     for j in split: 
      if 'Seq=' in j: 
       Seq = j.split('Seq=',1)[1] 
       file.loc[i,'Seq'] = int(Seq) 

例CSV:

No. Time  Source  Destination Protocol Length Info 
1 0.000000 sourceip 192.168.0.1 TCP   54  35165 > 80 [SYN] Seq=0 Win=16384 Len=0 
2 0.000001 sourceip 192.168.0.1 TCP   54  14378 > 80 [SYN] Seq=0 Win=16384 Len=0 
3 0.000003 sourceip 192.168.0.1 TCP   54  31944 > 80 [SYN] Seq=0 Win=16384 Len=0 

期望的結果:

No. Time  Source  Destination Protocol Length Info         Seq 
1 0.000000 sourceip 192.168.0.1 TCP   54  35165 > 80 [SYN] Seq=0 Win=16384 Len=0 0 
2 0.000001 sourceip 192.168.0.1 TCP   54  14378 > 80 [SYN] Seq=0 Win=16384 Len=0 0 
3 0.000003 sourceip 192.168.0.1 TCP   54  31944 > 80 [SYN] Seq=0 Win=16384 Len=0 0 
+0

從看一眼它似乎確定。你嘗試過'file.to_csv'嗎?你有沒有例外? – tmrlvi

+0

我確實嘗試過。沒有例外,我確實有Seq列,但每個值都是空的。我應該在什麼時候寫文件?在所有for循環之後還是在for循環之後?我對所有這些東西都很陌生。 – Tirion

+0

你應該在最後寫下這個文件。在你提取你想要的一切之後。下面的piRSquared方法沒有提取任何輸出?您可能需要檢查文件是否正確讀取。嘗試'print(file.head())'查看提取的前10行。 – tmrlvi

回答

2

使用str.extract

file['Seq'] = file.Info.str.extract('Seq=(\d+)', expand=False).astype(float) 
+1

這應該替換問題中'read_csv'下的所有代碼 – tmrlvi

+0

即使可能根本沒有Seq值?我試過這個,並得到ValueError:不能將浮點數NaN轉換爲整數。 – Tirion

+0

如果Seq''不在那裏,你希望有什麼? – piRSquared

相關問題