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列中的值