根据外部条件更改数据框模型

change the dataframe model on the external condition

如果数据帧是:

id  name    nicknames
1   i-123   sg-123
1   i-123   sg-234
1   i-123   sg-345
2   i-456   sg-654
2   i-456   sg-765
2   i-789   sg-875
2   i-789   sg-123
2   i-789   sg-987
2   i-789   sg-765

列表是:

prob = ['sg-123','sg-234','sg-345','sg-456','sg-567','sg-678']

检查 df['nicknames'] 是否在概率列表中,并从上面的 df 生成下面的数据帧。

应减少前 3 列行,因为我们需要每个名称的昵称列表,如预期的结果数据帧。 第4列:如果昵称存在概率中,则将此列中的昵称打印为列表。 第5列:如果昵称不在概率中,则将此列中的昵称打印为列表。 第 6 列: 第 4 列的计数 第 7 列:第 5 列的计数。 预期结果数据框:

id  name    nicknames                               exist                           not_exist                       count_exist count_not_exist
1   i-123   ['sg-123',' sg-234',' sg-345']          ['sg-123',' sg-234',' sg-345']  Null                            3           0
2   i-456   ['sg-654','sg-765']                     Null                            ['sg-654','sg-765']             0           2
2   i-789   ['sg-875','sg-123','sg-987','sg-765']   ['sg-123']                      ['sg-875','sg-987','sg-765']    1           3

IIUC:

d = df.groupby(['id', 'name'], as_index=False).nicknames.agg(list)

e = d.nicknames.map(lambda x: [*{*x} & {*prob}])
n = d.nicknames.map(lambda x: [*{*x} - {*prob}])
d.assign(exist=e, not_exist=n, count_exist=e.str.len(), count_not_exist=n.str.len())

   id   name                         nicknames                     exist                 not_exist  count_exist  count_not_exist
0   1  i-123          [sg-123, sg-234, sg-345]  [sg-234, sg-123, sg-345]                        []            3                0
1   2  i-456                  [sg-654, sg-765]                        []          [sg-654, sg-765]            0                2
2   2  i-789  [sg-875, sg-123, sg-987, sg-765]                  [sg-123]  [sg-987, sg-875, sg-765]            1                3