Python 如何比较groupby对象的列值并将它们汇总到新的列行中

Python 如何比较groupby对象的列值并将它们汇总到新的列行中,python,pandas,group-by,Python,Pandas,Group By,我有以下问题:我想在数据框中创建一列,汇总一行中的所有值。然后我想比较该列的行,创建一个包含所有列中所有值的行,但是每个值只出现一次。例如:我有以下数据框 df1: Column1 Column2 0 a 1,2,3 1 a 1,4,5 2 b 7,1,5 3 c 8,9 4 b 7,3,5 现在所需的输出是: df1_new: Column1 Column2 0 a 1,2,3,4,5 1

我有以下问题:我想在数据框中创建一列,汇总一行中的所有值。然后我想比较该列的行,创建一个包含所有列中所有值的行,但是每个值只出现一次。例如:我有以下数据框

    df1:

  Column1 Column2
0    a     1,2,3
1    a     1,4,5
2    b     7,1,5
3    c     8,9
4    b     7,3,5
现在所需的输出是:

df1_new:

  Column1 Column2
0    a    1,2,3,4,5
1    b    1,3,5,7
2    c    8,9

我目前正在尝试的是
result=df1.groupby('Column1')
,但是我不知道如何比较分组对象行中的值,然后将它们写入新列并删除重复项。我通读了groupby:split-apply-combine的pandas文档,但没有找到一种方法。我还想知道,一旦获得了所需的输出,是否有办法检查分组对象中的行数,df1_new的第2列中的每个值出现了多少行。在此方面的任何帮助都将不胜感激

实现这一点的方法是在分组的数据帧上应用函数

此函数将首先将序列(针对每个组)转换为列表,然后在列表中使用
拆分每个字符串,
然后使用将完整列表链接到单个列表中,然后将其转换为
set
,以便只剩下唯一的值,然后对其进行排序,然后使用
str.join
将其转换回字符串。范例-

from itertools import chain
def applyfunc(x):
    ch = chain.from_iterable(y.split(',') for y in x.tolist())
    return ','.join(sorted(set(ch)))

df1_new = df1.groupby('Column1')['Column2'].apply(func1).reset_index()
演示-

In [46]: df
Out[46]:
  Column1 Column2
0       a   1,2,3
1       a   1,4,5
2       b   7,1,5
3       c     8,9
4       b   7,3,5

In [47]: from itertools import chain

In [48]: def applyfunc(x):
   ....:         ch = chain.from_iterable(y.split(',') for y in x.tolist())
   ....:         return ','.join(sorted(set(ch)))
   ....:

In [49]: df.groupby('Column1')['Column2'].apply(func1).reset_index()
Out[49]:
  Column1    Column2
0       a  1,2,3,4,5
1       b    1,3,5,7
2       c        8,9
那么这个呢:

df1
      Column1 Column2
    0       a   1,2,3
    1       a   1,4,5
    2       b   7,1,5
    3       c     8,9
    4       b   7,3,5

df1.groupby('Column1').\
agg(lambda x: ','.join(x).split(','))['Column2'].\
apply(lambda x: ','.join(np.unique(x))).reset_index()

  Column1    Column2
0       a  1,2,3,4,5
1       b    1,3,5,7
2       c        8,9

当前
列2
的类型是什么?打印(键入(df1['Column2'][0])时,您会得到什么??请,提供代码来构造DataFrame@AnandSKumarColumn2的类型现在是一个系列
@ssoler Column2是这样创建的:
ResData['AR_Genes']=ResData[ResData.columns[1:10].apply(lambda x:','.join(x.dropna().astype(str).astype(str)),axis=1)
,然后使用左合并与已经存在的Column1合并。这意味着Column2的元素类型是
str
,而不是Series。您应该输出我给出的
print
语句的结果,这对每个人来说都会更清楚。您是否关心生成的
列2
中的顺序,以及
列2
中字符串中元素的顺序?@AnandSKumar我在指向您的句子中输出的代码是您的
print
语句的结果。不,元素的顺序并不重要。我想我应该多做一些关于熊猫的教程…谢谢你的回答!但是,当我尝试运行它时,我得到一个错误
AttributeError:“float”对象没有属性“split”
,它可以追溯到
df.groupby('Column1'['Coulmn2']].apply(applyfunc).reset_index()
。这可能与第2列中的某些行中存在
NaN
这一事实有关吗?是的,也许你可以在执行
y.split
之前设置一个条件来检查
NaN
。奇怪的是,删除所有
NaN
的条件不起作用。但我可以通过设置在一个新的df中输出条件并在其上应用代码,这很有效。再次感谢!感谢您的回答!但是,当我尝试运行您的代码时,它得到
ValueError:传递值的形状是(42,2),索引暗示(42,1)
。因为我的数据(字符串)与示例中的格式相同,我唯一的解释是在第2列的某些行中存在
NaN
值…@sequence\u难的是
NaN
作为字符串中的一个数字,还是总行作为
NaN
,或者任何
NaN
有时是第2列中的值,但从来不是第1列中的值