匹配一行中两列之间的集合

gpnt7bae  于 2022-10-23  发布在  其他
关注(0)|答案(3)|浏览(150)

我有两列表格:
|第1列|第2列|
| ------------ | ------------ |
| 3,4,5 | 3,5 |
| 8,9,12 | 8,9,12 |
| 8,9,12 | |
我需要用Col_2检查Col_1,如果Col_2中存在Col_1中的元素,则保存True,否则保存False。
输出表应为:
|Col_1|Col_2|检查|
| ------------ | ------------ | ------------ |
|3,4,5|3,5|真、假、真|
|8,9,12|8,9,12|真,真,真|
|8,9,12||假,假,假|

cuxqih21

cuxqih211#

import pandas as pd

df.fillna("", inplace=True)

df["Check"] = df.apply(
 lambda x: pd.Series(x["Col_1"].split(",")).isin(x["Col_2"].split(",")).values, axis=1
)
rekjcdws

rekjcdws2#

对测试拆分值使用列表理解:

df['check'] = [[z in y for z in x] for x, y in zip(df['Col_1'].fillna('').str.split(','), 
                                                   df['Col_2'].fillna('').str.split(','))]
print (df)
    Col_1   Col_2                  check
0   3,4,5     3,5    [True, False, True]
1  8,9,12  8,9,12     [True, True, True]
2  8,9,12    None  [False, False, False]

另一种采用DataFrame.explode的解决方案,并按组测试值:

df['check'] = (df.assign(Col_1 = df['Col_1'].fillna('').str.split(','), 
                         Col_2 = df['Col_2'].fillna('').str.split(','))
                 .explode('Col_1')
                 .groupby(level=0)
                 .apply(lambda x: list(x.Col_1.isin(x.Col_2.iat[0]))))
print (df)
    Col_1   Col_2                  check
0   3,4,5     3,5    [True, False, True]
1  8,9,12  8,9,12     [True, True, True]
2  8,9,12    None  [False, False, False]
c90pui9n

c90pui9n3#

df = df.fillna('')
df['check'] = df.apply(lambda row: ','.join(str(x in row.Col_2.split(',')) 
                                            for x in row.Col_1.split(',')), axis=1)
print(df)

输出:

Col_1   Col_2              check
0   3,4,5     3,5    True,False,True
1  8,9,12  8,9,12     True,True,True
2  8,9,12          False,False,False

相关问题