为了账号安全,请及时绑定邮箱和手机立即绑定

如何生成带有条件的熊猫数据框基础列表

如何生成带有条件的熊猫数据框基础列表

MMTTMM 2022-07-05 18:48:59
我在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?

4 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

IIUC,我们可以agg用做list,然后找出 df 中的原始值与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


查看完整回答
反对 回复 2022-07-05
?
精慕HU

TA贡献1845条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-07-05
?
HUH函数

TA贡献1836条经验 获得超4个赞

一种方法是用于itertools.product创建userId& movieId、 thenconcat和的所有组合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


查看完整回答
反对 回复 2022-07-05
?
千万里不及你

TA贡献1784条经验 获得超9个赞

我认为你需要:


 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


查看完整回答
反对 回复 2022-07-05

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号