给定如下DataFrame:
userId | preference
-------------------
1 | tea
1 | coffee
2 | apple
2 | apple
2 | apple
3 | tea
3 | coffee
3 | cookie
4 | banana
4 | cake
我需要将数据帧拆分为两个数据帧,这两个数据帧具有相同的userid分布,但具有唯一的首选项。例如,userId1
可以同时进入两个dataframe,因为用户至少有两个唯一的首选项。但是,userId2
将被忽略,因为只有一个唯一的首选项。
DataFrame1
userId | preference
-----------------
1 | tea
3 | tea
3 | coffee
4 | banana
DataFrame 2
userId | preference
-----------------
1 | coffee
3 | cookie
4 | cake
也就是说
DataFrame1['userId'].unique() == DataFrame2['userId'].unique()
注意:DataFrame2获取"剩余";DataFrame1没有取的行
通过使用
,我能够仅为具有两个或多个独特偏好的用户过滤数据df.groupby('userId').filter(lambda x: x['preference'].nunique()>1)
但是坚持让DataFrame以相同的userid为两个DF分割
我们可以取filtered_df并使用基于groupby
的dict
推导式,并通过比较总transform count
减去cumcount
并仅取小于或等于阈值的行来保留最后的n
:
filtered_df = (
df.groupby('userId').filter(lambda x: x['preference'].nunique() > 1)
)
n = 1 # Keep Last 1
g = filtered_df.groupby('userId')
dfs = {
f'df_{1 if not k else 2}': v
for k, v in filtered_df.groupby(
(g['userId'].transform('count') - g.cumcount()) <= n
)
}
dfs
:
{'df_1': userId preference
0 1 tea
5 3 tea
6 3 coffee
8 4 banana,
'df_2': userId preference
1 1 coffee
7 3 cookie
9 4 cake}