others - python - 如何基于列表条件生成Pandas dataframe

我在python中有以下列表


 movie_list = [11, 21, 31, 41, 51, 62, 55]



和下列movie dataframe


 userId movieId


 1 11


 1 21


 1 31


 2 62


 2 55



现在我要做的是,生成类似的dataframe,其中movieId不在dataframe中,而是在movie_list中,

期望生成的dataframe


 userId movieId


 1 41


 1 51


 1 62


 1 55


 2 11


 2 21


 2 31


 2 41


 2 51 



我该如何在pandas中实现它?

时间: 原作者:

可以用list来实现agg,然后用movie_list查找df中原始值之间的不同


s=df.groupby('userId').movieId.agg(list).


 map(lambda x : list(set(movie_list)-set(x))).explode().reset_index()


 userId movieId


0 1 41


1 1 51


2 1 62


3 1 55


4 2 41


5 2 11


6 2 51


7 2 21


8 2 31



原作者:

一种方法是使用itertools.product创建userId和&的所有组合drop_duplicates


from itertools import product



movie_list = [11, 21, 31, 41, 51, 62, 55]


df_all = pd.DataFrame(product(df['userId'].unique(), movie_list), columns=df.columns)



df2 = pd.concat([df, df_all]).drop_duplicates(keep=False)



print(df2)



[out ]


 userId movieId


3 1 41


4 1 51


5 1 62


6 1 55


7 2 11


8 2 21


9 2 31


10 2 41


11 2 51



原作者:

prod = pd.MultiIndex.from_product([df.userId.unique().tolist(), movie_list]).tolist()


(


 pd.DataFrame(set(prod).difference([tuple(e) for e in df.values]), 


 columns=['userId', 'movieId'])


 .sort_values(by=['userId', 'movieId'])


)



userId movieId


7 1 41


6 1 51


2 1 55


8 1 62


5 2 11


4 2 21


3 2 31


1 2 41


0 2 51



原作者:

我想你需要:


 df = df.groupby("userId")["movieId"].apply(list).reset_index()


 df["movieId"] = df["movieId"].apply(lambda x: list(set(movie_list)-set(x)))



 df = df.explode("movieId")


 print(df)



输出:


 userId movieId


0 1 41


0 1 51


0 1 62


0 1 55


1 2 41


1 2 11


1 2 51


1 2 21


1 2 31



原作者:
...