Pandas:保留列,计数,删除重复项

4

我目前正在尝试根据两列删除重复项,但在删除之前计算这些重复项的数量。我已经通过以下方式实现了这一点:

df_interactions = df_interactions.groupby(['user_id','item_tag_ids']).size().reset_index() \ .rename(columns={0:'interactions'})

但是这样会留下以下结果:

   user_id  item_tag_ids  interactions
0      170            71             1
1      170           325             1
2      170           387             1
3      170           474             1
4      170           526             2

它能够对计数、添加列和删除重复项做到我想要的,但如果我要保留原始结构(加上新列)怎么办?在groupby中添加更多内容会改变其行为。

这是原始结构,我只想按ID分组:

   user_id  item_tag_ids  item_timestamp
0   406225          7271      1483229353
1   406225          1183      1483229350
2   406225          5930      1483229350
3   406225          7162      1483229350
4   406225          7271      1483229350

我希望小的数据框中的新item_timestamp字段包含该组合的第一个出现的时间戳。

1
原始结构是什么? - micric
@micric 我正在尝试在去重之后保留一列 item_timestamp。基本上,按这些ID进行分组,计算交互次数(在去重之前的重复项),在去除重复项后添加 item_timestamps - apgsov
@kuomi,如果您在“groupby”之前不包括原始数据的示例,我们将无法为您提供帮助。 - Erfan
从您的原始结构中,预期输出是什么? - Scott Boston
1个回答

4
你想要使用如下的transform来保留原始数据的形状。
而要获取所有item_stamps值的列表,可以使用groupby结合agg(list)
# First we create count column with transform
df['count'] = df.groupby(['user_id', 'item_tag_ids']).user_id.transform('size')

# AFter that we merge our groupby with apply list back to our original dataframe
df = df.merge(df.groupby(['user_id', 'item_tag_ids']).item_timestamp.agg(list).reset_index(), 
              on=['user_id', 'item_tag_ids'], 
              how='left',
                  suffixes=['_1', '']).drop('item_timestamp_1', axis=1)

print(df)
   user_id  item_tag_ids  count            item_timestamp
0   406225          7271      2  [1483229353, 1483229350]
1   406225          1183      1              [1483229350]
2   406225          5930      1              [1483229350]
3   406225          7162      1              [1483229350]
4   406225          7271      2  [1483229353, 1483229350]
< p > .agg(list) 的解释是它将组的值聚合成如下列表:

df.groupby(['user_id', 'item_tag_ids']).item_timestamp.agg(list).reset_index()
Out[39]: 
   user_id  item_tag_ids            item_timestamp
0   406225          1183              [1483229350]
1   406225          5930              [1483229350]
2   406225          7162              [1483229350]
3   406225          7271  [1483229353, 1483229350]

编辑答案,这符合您的要求吗? @kuomi - Erfan
这似乎保留了原始结构,但添加了一个计数。我要寻找的是按前两列分组,然后获取剩余内容的时间戳。分组将我的数据框从236268裁剪到31548,所以我要找的是新数据框中每个索引的关联时间戳。 - apgsov
抱歉如果我没有表述清楚,我需要一组独特的用户ID和物品标签ID组合,并计算重复出现的次数。然后,我想要每个独特组合的第一个时间戳来自原始DF。 - apgsov
我现在认为我理解你想要什么了,请检查编辑。@kuomi - Erfan
你的解决方案比我刚试过的更有用,因为它保留了每个计数的时间戳,这太棒了。非常感谢你。 - apgsov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接