Pandas从列表栏中选择一个项目,然后在其他列表栏中搜索

yfjy0ee7  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(143)

我有一个如下所示的 Dataframe

sample_df = pd.DataFrame({'single_proj_name': [['jsfk'],['fhjk'],['ERRW'],['SJBAK']],
                          'single_item_list': [['ABC_123'],['DEF123'],['FAS324'],['HSJD123']],
                          'single_id':[[1234],[5678],[91011],[121314]],
                          'multi_proj_name':[['AAA','VVVV','SASD'],['QEWWQ','SFA','JKKK','fhjk'],['ERRW','TTTT'],['SJBAK','YYYY']],
                          'multi_item_list':[['XYZAV','ADS23','ABC_123'],['XYZAV','DEF123','ABC_123','SAJKF'],['QWER12','FAS324'],['JFAJKA','HSJD123']],
                          'multi_id':[[2167,2147,29481],[2313,57567,2321,7898],[1123,8775],[5237,43512]]})

我想做以下几点
a)从single_item_list中为每行选取值
b)在同一行multi_item_list列中查找该值
c)如果发现匹配,则仅保留multi_item_list中的该值,并从multi_item_list中删除所有其他不匹配的值
d)根据匹配项的位置,在multi_id列表中查找对应的值,只保留该项,从列表中删除所有其他位置项
所以,我尝试了下面,但它不工作

def func(df):
    return list(set(sample_df['single_item_list']) - set(sample_df['multi_item_list']))

sample_df['col3'] = sample_df.apply(func, axis = 1)

我希望我的输出如下所示

6l7fqoea

6l7fqoea1#

你可以并行explode这两个列表(panda 1.3+),然后过滤:

(sample_df
  .explode(['multi_item_list', 'multi_id'])
  .loc[lambda d: d['single_item_list'].str[0].eq(d['multi_item_list'])]
)

如果您想要回您的列表:

(sample_df
  .explode(['multi_item_list', 'multi_id'])
  .loc[lambda d: d['single_item_list'].str[0].eq(d['multi_item_list'])]
  .assign(multi_item_list=lambda d: d['multi_item_list'].apply(lambda x: [x]),
          multi_id=lambda d: d['multi_id'].apply(lambda x: [x]),
         )
)

输出:

single_proj_name single_item_list single_id           multi_proj_name multi_item_list multi_id
0           [jsfk]        [ABC_123]    [1234]         [AAA, VVVV, SASD]       [ABC_123]  [29481]
1           [fhjk]         [DEF123]    [5678]  [QEWWQ, SFA, JKKK, fhjk]        [DEF123]  [57567]
2           [ERRW]         [FAS324]   [91011]              [ERRW, TTTT]        [FAS324]   [8775]
3          [SJBAK]        [HSJD123]  [121314]             [SJBAK, YYYY]       [HSJD123]  [43512]
使用列表解析的备选项:
sample_df[['multi_item_list', 'multi_id']] = \
pd.DataFrame([next(([[x], [c[i]]] for i,x in enumerate(b) if x==a[0]), None)
              for a, b, c in
              zip(sample_df['single_item_list'],
                  sample_df['multi_item_list'],
                  sample_df['multi_id'])],
              columns=['multi_item_list', 'multi_id'])

相关问题