2016-03-02 78 views
0

我有一個單一的數據框類似如下:Python的大熊貓GROUPBY工作不正常

   ip    domain 
0 46.101.214.145 cnwkabrnyld1c0[.]com 
1 46.101.214.145  anfj63m[.]com 
2 46.101.214.145  anf3xnem[.]com 
3 69.195.129.70 cnwkabrnyld1c0[.]com 
4 69.195.129.70  anfj63ms[.]com 

我想GROUPBY的「IP」欄中,這樣它將聚集重複到同一行。

所需的輸出:

   ip    domain 
0 46.101.214.145 cnwkabrnyld1c0[.]com | anfj63m[.]com | anf3xnem[.]com 
3 69.195.129.70 cnwkabrnyld1c0[.]com 
4 69.195.129.70  anfj63ms[.]com 

這看起來非常簡單的基礎上,無數的SOF和熊貓文件我一直在讀。

這裏是我的代碼:

pDNSPanda = pd.read_csv('/tmp/pDNSCSV.csv', names=['ip', 'domain']) 
g = pDNSPanda.groupby("ip").agg('|'.join) 

這是我真正得到:

    domain 
ip 
0.0.0.0  ip|domain 
1.1.1.200  ip|domain 
1.148.56.163 ip|domain 
1.167.81.129 ip|domain 
1.193.28.230 ip|domain 

編輯:

有人建議我盡我自己針對上述數據集的代碼。

test.csv 
46.101.214.145 cnwkabrnyld1c0[.]com 
46.101.214.145  anfj63m[.]com 
46.101.214.145  anf3xnem[.]com 
69.195.129.70 cnwkabrnyld1c0[.]com 
69.195.129.70  anfj63ms[.]com 

>>> import pandas as pd 
>>> p = pd.read_csv('/tmp/test.csv', names=['ip', 'domain']) 
>>> g = p.groupby("ip").agg("|".join) 
>>> print g 
             domain 
ip 
46.101.214.145  anfj63m[.]com ip|domain 
46.101.214.145  anf3xnem[.]com ip|domain 
46.101.214.145 cnwkabrnyld1c0[.]com ip|domain 
69.195.129.70  anfj63ms[.]comp|domain 
69.195.129.70 cnwkabrnyld1c0[.]com ip|domain 
+0

有趣 - 我用你的代碼得到想要的結果。你確定你的初始DataFrame是發佈的嗎? – Alex

+0

它實際上更大,我使用[。]而不是使用[。]清理域(爲了安全起見)。 – gleb1783

+0

您的代碼似乎是正確的... – MaxU

回答

2

您需要groupbyagg命令之間domain。根據需要添加管道連接周圍的間距,例如' | '.join(...)

pDNSPanda.groupby("ip").domain.agg('|'.join) 

ip 
46.101.214.145 cnwkabrnyld1c0[.]com|anfj63m[.]com|anf3xnem[.]com 
69.195.129.70     cnwkabrnyld1c0[.]com|anfj63ms[.]com 
Name: domain, dtype: object 

如果您的域中有浮動內容,最好將它們轉換爲字符串。

df['domain'] = df.domain.astype(str) 
+0

當我這樣做時,我得到一個TypeError:TypeError:序列項目24:預期的字符串,找到的浮點數 – gleb1783

+0

意味着該域中的項目是一個浮點數。 – Alexander

+0

所以我只是遍歷我的整個數據子集,併爲每個項目(包括IP和域)打印Python類型。沒有浮點數... – gleb1783

1

我覺得在ip列這首值也像我的第一排和第二排特有的 - 那麼你groupby後得到domain列只有一個值:

print pDNSPanda 
       ip    domain 
0   0.0.0.0    ip|domain 
1  1.1.1.200    ip|domain 
2 46.101.214.145 cnwkabrnyld1c0[.]com 
3 46.101.214.145   anfj63m[.]com 
4 46.101.214.145  anf3xnem[.]com 
5 69.195.129.70 cnwkabrnyld1c0[.]com 
6 69.195.129.70  anfj63ms[.]com 


g = pDNSPanda.groupby("ip").agg('|'.join) 
print g 
                  domain 
ip                
0.0.0.0             ip|domain 
1.1.1.200            ip|domain 
46.101.214.145 cnwkabrnyld1c0[.]com|anfj63m[.]com|anf3xnem[.]com 
69.195.129.70     cnwkabrnyld1c0[.]com|anfj63ms[.]com 

但我認爲這是更好地利用groupby與彙總欄一樣,在他的答案中提到Alexander