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/