如何通过重复和删除重复来组织 Dataframe 中的字段

bn31dyow  于 2022-10-23  发布在  其他
关注(0)|答案(2)|浏览(155)

我有这个

id phone1 phone2 
1  300    301
1  303    300
1  300    303
2  400    401

想要这个吗

id phone1 phone2 phone3
1  300    303    301
2  400    401

我尝试过按id和列phone1分组,应用count函数,将其添加到列表中,验证id和phone是否已经存在,并对第三列求和,然后对同一列表中的phone2执行相同的操作
在它重新组织 Dataframe 之后,迭代列表,但这对于数百万数据来说太慢了,我不得不处理

dataframe1 = dataframe.groupby(['id', 'phone1']).count().reset_index()
dataframe2 = dataframe.groupby(['id', 'phone2']).count().reset_index()

要添加到列表中的结果

id phone1 phone2
1  300    2    
1  303    1
2  401    1

id phone1 phone2
1  300    1   
1  301    1
1  303    1
2  400    1
r8uurelv

r8uurelv1#

迭代 Dataframe 太慢,不推荐
您可以对电话进行分组,并为每个id应用列表功能,然后按重复项进行组织并拆分为新列

nmpmafwu

nmpmafwu2#

您可以melt将phone列重新整形为行,然后删除每个组的重复项。最后,pivot重新整形为宽格式。

out = (df
   .melt('id')
   .drop_duplicates(['id', 'value'])
   .assign(col=lambda d: d.groupby('id').cumcount().add(1))
   .pivot_table(index='id', columns='col', values='value', fill_value=pd.NA)
   .astype('Int64') # optional
   .add_prefix('phone')
   .rename_axis(columns=None).reset_index()
)

输出:

id  phone1  phone2  phone3
0   1     300     303     301
1   2     400     401    <NA>

相关问题