当前位置: 首页 > 知识库问答 >
问题:

如何使用Groupby追加列表?值错误:函数不减少

相德宇
2023-03-14

我有以下数据框:

df=pd.DataFrame({'code1':["A","B","A"],"code2":["k","l","k"],'Names':[['EUGENIO NETO','JUAN MATIAS SERAGOPIAN'],['EUGENIO LUPORINI NETO'],['SIMONE FANKHAUSER','ALEX SOUZA']]})

  code1 code2                                   Names
0     A     k  [EUGENIO NETO, JUAN MATIAS SERAGOPIAN]
1     B     l                 [EUGENIO LUPORINI NETO]
2     A     k         [SIMONE FANKHAUSER, ALEX SOUZA]

我想按code1code2进行分组,并组合名称中的列表。在某种程度上,它看起来像这样:

  code1 code2  Names
0     A     k  [EUGENIO NETO, JUAN MATIAS SERAGOPIAN, SIMONE FANKHAUSER, ALEX SOUZA]
1     B     l  [EUGENIO LUPORINI NETO]

已检查以下答案:

Groupby和append列表和字符串

pandas groupby和join列表

所以我试图根据我的情况调整这些问题的答案(但没有设法解决):

df['Names']=df[['code1','code2',"Names"]].groupby(['code1','code2'])["Names"].agg('sum')
----> ValueError: Function does not reduce

df['Names']=df[['code1','code2',"Names"]].groupby(['code1','code2'])["Names"].agg('Names')
----> AttributeError: 'SeriesGroupBy' object has no attribute 'Names'

df['Names']=df[['code1','code2',"Names"]].groupby(['code1','code2'])["Names"].transform(lambda x: append(x))
----> NameError: name 'append' is not defined

我是错过了什么还是错了?

编辑

Andrej和NYC Coder确实提出了功能性解决方案。但是当我在一个更大的数据集中运行时,我得到了相同的ValueError: Function不会减少。研究了这可能是什么,并在这里发现了这个问题:熊猫Groupby Agg函数不减少

选择的答案建议使用元组,因为列表是有问题的。另一个答案解释了熊猫代码中发生的情况。元组是最好的方法吗?如何在这里应用?


共有2个答案

翟曦之
2023-03-14

这应该可以做到:

df['Names'] = df['Names'].agg(lambda x: ','.join(map(str, x)))
df = df.groupby(by=['code1', 'code2'], as_index=False).agg('sum')
print(df)



  code1 code2                                              Names
0     A     k  EUGENIO NETO,JUAN MATIAS SERAGOPIANSIMONE FANK...
1     B     l                              EUGENIO LUPORINI NETO
邵沛
2023-03-14
print( df.groupby(['code1', 'code2'], as_index=False).agg('sum') )

打印:

  code1 code2                                              Names
0     A     k  [EUGENIO NETO, JUAN MATIAS SERAGOPIAN, SIMONE ...
1     B     l                            [EUGENIO LUPORINI NETO]

编辑:具有itertools.chain的解决方案:

from itertools import chain

df=pd.DataFrame({'code1':["A","B","A"],"code2":["k","l","k"],'Names':[['EUGENIO NETO','JUAN MATIAS SERAGOPIAN'],['EUGENIO LUPORINI NETO'],['SIMONE FANKHAUSER','ALEX SOUZA']]})
print( df.groupby(['code1', 'code2'], as_index=False).agg(lambda x: list(chain.from_iterable(x))) )
 类似资料:
  • 有递归函数的问题,应该相对简单做,但似乎不能得到正确的。 我有一个文件夹结构,它的文件夹可以包含其他文件夹、图像或文件。每个文件夹都有权限。我想让我的函数递归地构建一个与每个文件夹关联的权限列表。 改了号, 得到:

  • 我有问题,以简化我的代码与许多地图和列表。 我想填充3个列表,然后填充到匹配的地图。清空3个列表,并在下一个if条件中再次填充它们,然后将它们传递到匹配映射中。 有人知道我如何最好地实现这一点,从而减少列表的数量吗?谢谢你

  • 我需要在Java8中迭代一个列表并将值追加到StringBuilder中。我已经编写了下面的代码,它正在工作,但是我需要使用map/stream等来迭代列表,而不是使用forEach循环。 我有另一个列表和地图,如果元素列表与地图的键匹配,我需要替换一个字符串。 如何使用Java8的map()/stream()等功能而不是forEach循环迭代相同的代码?

  • 我有一个JSP代码将数据追加到datatables中,从另一个AJAX页面获得响应,当将数据追加到表中时,数据的追加非常奇怪。我将在下面展示它。 正确的数据应该是这样的: 从AJAX页面获取数据的JSP代码 下面是我将Array结果附加到DT中的JAVA代码 在控制台中,它显示正确,但在添加到表中时,它是错误的。

  • 问题内容: 我正在使用Json.Net for .Net 4.5,并且在以下对象上使用填充对象时,它会使用json的内容而不是设置其值来增加List的值。 Json.Net 类 当它们最初加载时,一切都正确,但是从JSON重新加载两个MyStringLists都是重复的 问题答案: 您应该告诉Json.Net替换数组,如下所示:

  • 我正在尝试添加选项到一个动态选择输入,依赖于在另一个选择下拉菜单中选择的值。 我已经设法在选择父级中的值时填充数据对象。所有的my触发器也会被执行,子select被禁用,它应该包含数据对象中的所有值,但是它没有填充任何选项。 JS(Coffeescript)代码段: 最后一节特别重要,因为这是JSON数据对象应转换为新选项的地方。下面是在一种情况下响应的对象(根据Firebug): 在本例中,儿童