Pandas:将DataFrame拆分为两个DataFrame,这些DataFrame具有相同的id分布和唯一的值.&l



给定如下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将被忽略,因为只有一个唯一的首选项。

总之,从原始DF中,我想生成两个DataFrame,如下所示:
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并使用基于groupbydict推导式,并通过比较总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}

最新更新