2016-09-23 52 views
1

我解析包含HTTP交易成熊貓數據幀的一些日誌。每行都是一個trasaction,所以一列有IP地址,另一列有主機名等。對於每一行(日誌條目),我想將標題參數提取到一個列表中,並將該列表與其餘的該行的信息。最佳的方式小列表添加到大熊貓數據幀

的問題是:如何存儲的參數列表,以便它可以從日誌中的數據的其餘部分很容易交叉引用?

例如起見,假設我有這樣的數據幀,其中用戶的寵物列表存儲作爲一個字符串,我們要分析出動物個體,並將其存儲爲列表。這個想法是存儲解析字符串的結果,以便實際的解析例程只需運行一次。

# Original Dataframe 
User | PetsString 
---------------------- 
Mary | 'dog/cat/rat' 
John | 'dog/lizard' 

方法1)我可以列添加到數據幀,並存儲在此列清單。

User | PetsString | PetsList 
-------------------------------------------- 
Mary | 'dog/cat/rat' | ['dog','cat','rat'] 
John | 'dog/lizard' | ['dog','lizard'] 

方法2)我可以創建具有列表條目,以表示日誌的原始數據幀爲紹興德勝回參考位置的列中的另一數據幀。我想避免這種情況,因爲我認爲同時迭代兩個數據幀比迭代單個大型列表要慢。例如。

User | PetsString 
----------------------- 
Mary | 'dog/cat/rat' 
John | 'dog/lizard' 

#Separate DataFrame for cross-reference 

User | Pet 
----------------- 
Mary | 'dog' 
Mary | 'cat' 
Mary | 'rat' 
John | 'dog' 
John | 'lizard' 

方法3)有人建議增加,比方說,50列,以我現有的數據幀和存儲在其中一列各列表項。我不希望有超過50個標題參數。這似乎是速度最優的,但在列數方面有着令人討厭的限制。例如。

User | PetsString  | Pet0 | Pet1  | Pet2 
------------------------------------------------------ 
Mary | 'dog/cat/rat' | 'dog' | 'cat' | 'rat' 
John | 'dog/lizard' | 'dog' | 'lizard' | 

我有兩個問題:

(I)假設我需要計算將讀取一行,並從相應的列表中,三種佈局的是速度,最優的所有參數的函數?

(ⅱ)哪一個是空間最優?我不確定熊貓如何處理對象,但我相信如果使用方法1,熊貓將創建一個與最長列表一樣寬的列。類似地,方法3將不得不爲全「Pet2」列分配空間,即使John沒有一個空間,等,但即使是權衡的一個大致的瞭解,對我就是

在此先感謝您的幫助是非常有用的!

回答

2

在熊貓數據幀的列中的值被存儲在均相numpy的陣列。考慮以下幾點:

In [95]: pd.DataFrame({'a': ['foo', 'bar/baz']}).a.dtype 
Out[95]: dtype('O') 

In [96]: pd.DataFrame({'a': [['foo'], ['bar', 'baz']]}).a.dtype 
Out[96]: dtype('O') 

這說明:

  1. 當存儲不同長度的字符串,熊貓使用對象的numpy的陣列(numpy的也有同樣的固定大小的字符串字符串數組,但熊貓不使用它們)。

  2. 當您存儲列表時,Pandas還使用numpy對象數組。

基於此,我認爲你的第一個選擇將具有良好的記憶和速度性能。熊貓和numpy比普通的Python數據結構更具優勢,例如龐大的數字序列,其中單個數字對象的Python開銷很大。字符串的Python list非常高效,並且(非固定大小的)字符串的數組並非真正具有優勢。

事實上,你可能會考慮Pandas是否在普通香草Python中提供了任何優勢。爲什麼不將dict映射到字符串list?例如?

+0

感謝您的迴應!現在我可以看到,字符串列表對熊貓來說並不是那麼好。 Numpy有一個固定寬度字符串的數據類型,但是在使用Pandas時,它們被存儲爲'object'類型,所以在我的情況下,Pandas的速度增益並沒有太大的提高。在這一點上我堅持下去,因爲我已經寫了一半的代碼來使用熊貓。 – Max