[英]how to generate pandas dataframe basis list with condition
我在python中有以下列表
movie_list = [11, 21, 31, 41, 51, 62, 55]
和以下电影数据帧
userId movieId
1 11
1 21
1 31
2 62
2 55
现在我想做的是生成类似的数据帧,其中movieId
不在数据帧中,但在 movie_list 中
我想要的数据框是
userId movieId
1 41
1 51
1 62
1 55
2 11
2 21
2 31
2 41
2 51
我怎样才能在pandas
做到这一点?
IIUC,我们可以用list
做agg
,然后找到 df 中原始值与movie_list
之间的movie_list
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
和movieId
所有组合,然后concat
和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)
[出去]
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.