![](/img/trans.png)
[英]pandas - drop duplicates in a column, count the number of duplicates and aggregate one column
[英]Pandas: Keep Column, Count, Drop Duplicates
我目前正在尝试根据两列删除重复项,但在删除之前计算重复项。 我已经设法做到这一点
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
字段来包含该组合的第一个出现的时间戳。
您想使用如下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]
.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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.