python - pandas groupby + 列表

标签 python pandas

Pandas 新手,很抱歉,如果这是旧帽子。我想要完成的任务与 grouping rows in list in pandas groupby 中包含的内容类似。 ,但我有超过两列,无法弄清楚如何让所有列与分组值一起显示。这就是我正在尝试做的事情。

data = [{'ip': '192.168.1.1', 'make': 'Dell', 'model': 'UltraServ9000'},
{'ip': '192.168.1.3', 'make': 'Dell', 'model': 'MiniServ'},
{'ip': '192.168.1.5', 'make': 'Dell', 'model': 'UltraServ9000'},
{'ip': '192.168.1.6', 'make': 'HP', 'model': 'Thinger3000'},
{'ip': '192.168.1.8', 'make': 'HP', 'model': 'Thinger3000'}]

In [2]: df = pd.DataFrame(data)
In [3]: df
Out[4]:
            ip  make          model
0  192.168.1.1  Dell  UltraServ9000
1  192.168.1.3  Dell       MiniServ
2  192.168.1.5  Dell  UltraServ9000
3  192.168.1.6    HP    Thinger3000
4  192.168.1.8    HP    Thinger3000    

<magic>

Out[?]:    
            ip               make           model
0  192.168.1.1, 192.168.1.5  Dell   UltraServ9000
1  192.168.1.3               Dell        MiniServ
3  192.168.1.6, 192.168.1.8  HP       Thinger3000

提前致谢:)

最佳答案

groupby 采用参数 by,通过该参数您可以指定要操作 groupby< 的变量列表/结束。因此该问题的答案修改如下:

df.groupby(by = ["a", "c"])["b"].apply(list).reset_index()

编辑:查看您的评论:由于除 a 之外的所有列都具有相同的值,您可以在 by 参数中轻松列出它们,因为它们不会影响结果。为了节省您的时间并防止您实际输入所有名称,您可以执行以下操作:

df.groupby(by = list(set(df.columns) - set(["b"])))["b"].apply(list).reset_index()

或者,您可以通过传递一个字典来利用 agg 函数,该字典对于所有列都将采用 max,对于 b 将返回列表:

aggregate_functions = {x: max for x in df.columns if x != "a" and x != "b"}
aggregate_functions["b"] = lambda x: list(x)
df.groupby(by = "a").agg(aggregate_functions)

您更喜欢哪个取决于您,可能后者更具可读性。

关于python - pandas groupby + 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41856173/

相关文章:

python - 如何使用 "loc"和 "for"在 pandas 中添加行?

python - 在 include 中使用命名空间有什么意义? ( Django 2.0)

Python Re,需要匹配列表

pandas - 分割数据以按条件进行训练和测试

python - 将给定的 pandas 数据帧转换为另一个数据帧

python - 使用另一个数据框 pandas 中的相同内容重命名每 2 列

python - 检查列表是否由其他列表组成

python - 将 gz 文件直接加载到 pandas 数据框中

python - 使用多列键 reshape Pandas 数据框

python - 从 numpy 数组创建 Panda Df