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

使用Pandas将不同行的列表按多列值分组

常雅珺
2023-03-14

我有一个这样的数据框df1

import pandas as pd
dic = {'A':[0,0,2,2,2,1,5,5],'B':[[1,5,3,8],[1,8,7,5],[7,8,9,5],[3],[1,5,9,3],[0,3,5],[],[4,2,3,1]],'C':['a','b','c','c','d','e','f','f'],'D':['0','8','7','6','4','5','2','2']}
df1 = pd.DataFrame(dic)

看起来像这样:

#Initial dataframe 
   A             B  C  D
0  0  [1, 5, 3, 8]  a  0
1  0  [1, 8, 7, 5]  b  8
2  2  [7, 8, 9, 5]  c  7
3  2           [3]  c  6
4  2  [1, 5, 9, 3]  d  4
5  1     [0, 3, 5]  e  5
6  5            []  f  2
7  5  [4, 2, 3, 1]  f  2

我的目标是对列AC中具有相同值的行进行分组,并以如下方式合并列B的内容:

#My GOAL
   A                B  C
0  0     [1, 5, 3, 8]  a
1  0     [1, 8, 7, 5]  b
2  2  [3, 7, 8, 9, 5]  c
3  2     [1, 5, 9, 3]  d
4  1        [0, 3, 5]  e
5  5     [4, 2, 3, 1]  f

如您所见,列AC中具有相同项的行将被合并,而如果至少有一行不同,它们将保持原样。我的想法是使用groupbysum函数,如下所示:

df1.groupby(by=['A','C'],as_index=False,sort=True).sum()

但是Python返回错误消息:Function没有减少

你能告诉我我的代码有什么问题吗?为了实现我的目标,我应该写些什么?

注意:我不关心可以丢弃的列D会发生什么。

共有2个答案

白宏大
2023-03-14

另一种可能性:

df1.groupby(by=['A','C'],as_index=False,sort=True).agg({'B': lambda x: tuple(sum(x, []))})

结果:

   A  C                B
0  0  a     (1, 5, 3, 8)
1  0  b     (1, 8, 7, 5)
2  1  e        (0, 3, 5)
3  2  c  (7, 8, 9, 5, 3)
4  2  d     (1, 5, 9, 3)
5  5  f     (4, 2, 3, 1)

基于此答案(列表似乎不太适合聚合)。

越嘉石
2023-03-14

其中一种可能是在itertools.chain(*iterables)

import itertools
df1.groupby(['A', 'C'])['B'].apply(lambda x: list(itertools.chain(*x))).reset_index()

(或)

使用lambda

df1.groupby(by=['A','C'])['B'].apply(lambda x: x.sum()).reset_index()

两者都产生:

默认情况下,Groupby(). sum()查找要执行聚合的数字类型(标量)值,而不是像list这样的元素集合。

 类似资料:
  • 问题内容: 我有一个关于将数据框列中的列表分成多行的问题。 假设我有这个数据框: 我想要数字的每个单一组合,因此最终结果将是: 因为现在我得到以下结果: 为了得到上面的结果,我做了: 问题答案: 与斯科特·波士顿(Scott Boston)的建议类似,我建议您分别展开各列,然后将它们合并在一起。 例如,对于“职位”: 并且,一起:

  • 如何将这列列表拆分为两列? 期望的结果:

  • 问题内容: 我有一列如下所示的熊猫: 我需要将列表的此列分为2列,并使用。 问题答案: 您可以使用与构造函数通过转换为创建通过使用: 对于新的DataFrame: 解决方案apply(pd.Series)非常慢:

  • 问题内容: 我有一个如下所示的Pandas数据框: 我正在尝试将列表分成几列,如下所示: 没有值的列(因为列表没有那么长)用空白或NaN或其他内容填充。 我见过类似的回答这一个和其他类似的给它,而他们在长度相等的名单工作,他们都扔错误,当我尝试使用的长度不等的列表中的方法。有什么好办法吗? 问题答案: 尝试: 包括 我们可以通过以下方式确定所有格式:

  • 问题内容: 我想在df列中获取特定值的百分比。假设我有一个(fol,col2,col3,性别)的df性别列,其值是M或F。我想获取df中M和F值的百分比。 我已经尝试过了,这给了我M和F实例的数量,但是我想要这些作为df中值总数的百分比。 有人可以帮忙吗? 问题答案: 使用有:

  • 问题内容: 假设我有一个这样的列表: 我如何最优雅地将其分组以在Python中获得此列表输出: 因此,这些值按次值分组,但顺序保留下来。 问题答案: