Pandas中的布尔列,带有检查复杂评分条件的窗口函数

ffscu2ro  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个框架,看起来像这样:

x        y         score    
Cat      Dog       0.1    
Dog      Monkey    0.5     
Fish     Cat       0.2     
Cat      Fish      0.2   
Monkey   Dog       0.4    
Dog      Cat       0.7

基本上,我需要一个新的布尔列来查看所有对和它们的反转,例如(Cat,Dog)和(Dog,Cat),并在一个对的得分大于反转对的得分时分配True,否则分配False。如果相等,则两个对都分配True。即:

x        y         score    bool
Cat      Dog       0.1      False   # False because Dog,Cat > Cat,Dog
Dog      Monkey    0.5      True    # True because Dog,Monkey > Monkey, Dog
Fish     Cat       0.2      True    # True because both have the same score
Cat      Fish      0.2      True    # ...
Monkey   Dog       0.4      False
Dog      Cat       0.7      True

我确信我可以通过在行上应用反向过滤器来完成函数,然后返回一个分数检查;然而,这个列表可能很长(n〉100k),时间是一个因素。事实证明这比我想象的要棘手。我想知道是否可以用一个还没有遇到的神奇Pandas函数或滚动窗口以一种更复杂的方式来完成。
注:
1.每一对(x,y)都是唯一的。
1.对于每一对(x,y),正好有一个反转(y,x)。
1.在同一列中,同一类别可以多次出现,例如,Cat在x的此框架中出现两次。
1.评分范围为0 - 1。
框架:

df = pd.DataFrame.from_records(zip(["Cat","Dog","Fish","Cat","Monkey","Dog"], ["Dog","Monkey","Cat","Fish","Dog","Cat"], [0.1,0.5,0.2,0.2,0.4,0.7]),columns=["x","y","score"])
a0x5cqrl

a0x5cqrl1#

您可以交换xy列,合并x/y对,并比较分数与反转分数:

(df.merge(
     df.assign(x = df.y, y = df.x)
       .rename(columns={'score': 'rev_score'})
 ).assign(bool = lambda x: x.score >= x.rev_score)
 .drop('rev_score', axis=1))

        x       y  score   bool
0     Cat     Dog    0.1  False
1     Dog  Monkey    0.5   True
2    Fish     Cat    0.2   True
3     Cat    Fish    0.2   True
4  Monkey     Dog    0.4  False
5     Dog     Cat    0.7   True

相关问题