Python Pandas Groupby没有按预期工作

时间:2016-03-02 20:58:58

标签: python pandas

我有一个如下的数据框:

               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

我试图通过“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和Panda文档,这看起来非常简单。

这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

domaingroupby命令之间需要agg。如果需要,在管道连接周围添加间距,例如' | '.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)

答案 1 :(得分:1)

我认为第ip列中的第一个值与我的第一行和第二行一样是唯一的 - 然后在domain后的groupby列中只得到一个值:

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