gpt4 book ai didi

Python:pandas数据框复杂的更新条件

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:40 25 4
gpt4 key购买 nike

我有 2 个数据框 dfItemRatings 和 dfItemMode,如下所示。

dfItemRatings 中的 ItemID 始终是唯一的

dfItemRatings:

ItemID ItemName ItemRating
A1 ItemA1 0
A2 ItemA2 0
B1 ItemB1 0
B2 ItemB2 0
B3 ItemB3 0

dfItemMode:

ParentID    ItemMode    ItemRating
A1 Paid 5
A1 Received 6
B1 Paid 10
B2 Paid 3
B2 Received 4
B3 Paid 1
B3 Received 2
B3 Paid 7

我想用以下条件更新 dfItemRatings 中的 ItemRating 列

  1. 对于 dfItemRatings 中的每个 ItemID,查找 dfItemMode 中匹配 ParentID 的数量

    例如A1 = 2,B1 = 1,B2 = 2,B3 = 3

  2. 我只想更新那些 count == 2 且 ItemMode = 'Paid' 的 ParentID 的评分

所以我的最终输出应该如下所示

ItemID ItemName ItemRating
A1 ItemA1 5
A2 ItemA2 0
B1 ItemB1 0
B2 ItemB2 3
B3 ItemB3 0

正如您所看到的,dfItemMode 中只有 A1 和 B2 的 count == 2,并且在这 2 条记录中,我只想选择 ItemMode = 'Paid' 的 ItemRatings

我的实际数据帧有超过 50000 条记录。因此这些数据帧上的 for 循环会降低性能。用最少的 for 循环实现这一点的最快方法是什么?可能正在使用 df.loc[] ?

请指教。

问候维普尔

最佳答案

使用的方法:

  • 我们使用groupby.transform根据每个项目重复的次数为 ParentID 列创建掩码。

  • Series.isin 根据匹配的 ItemsID 为 ParentID 创建掩码

  • Series.eq基于等价创建 bool 掩码。

  • Series.map 用于映射和更新值

<小时/>
c1=dfItemMode.groupby('ParentID')['ParentID'].transform('size').eq(2)
c2=dfItemMode['ParentID'].isin(dfItemRatings['ItemID'])
c3=dfItemMode['ItemMode'].eq('Paid')

dfItemRatings['ItemRating']=( dfItemRatings['ItemID'].map( dfItemMode.loc[c1&c2&c3]
.set_index('ParentID')['ItemRating'] )
.fillna(dfItemRatings['ItemRating']) )
print(dfItemRatings)

输出

  ItemID ItemName  ItemRating
0 A1 ItemA1 5.0
1 A2 ItemA2 0.0
2 B1 ItemB1 0.0
3 B2 ItemB2 3.0
4 B3 ItemB3 0.0

关于Python:pandas数据框复杂的更新条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59143394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com