2016-03-02 56 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