如何比较数据框相邻行中列表中的任何项目是否匹配

How to compare if any items from a list in adjacent rows of the dataframe match

我有一个 pandas 数据框,其中包含 DIAG_CD 列中的列表 ():

这是一个示例,但数据集最多可能有 100,000 行。

            DIAG_CODE
0          [  "M9901",   "M9902",   "M9903",   "M5412"]

1          [  "M9901"]

2          [  "M9901",   "M9902",   "M9903",   "M5412"]

3          [  "M9901",   "M9902",   "M9903",   "M542"]

...

20    [  "M542",   "M9902",   "M9903",   "M25519",  ...

21    [  "M542",   "M9902",   "M9903",   "M25519",  ...

我的目标是查看相邻两行列表中的任何项目是否匹配。例如,第 0 行的列表是否包含第 1 行列表中的任何项目,答案是肯定的。同样,第 1 行与第 2 行匹配。

我尝试了不同的方法,但无法正常工作。

我试过了,但它产生了错误 - AttributeError: 'list' object has no attribute 'split': zipped = zip(df1['DIAG_CD'], df1['DIAG_CD'].shift(1)) df1['diagCodeMatch'] = [int(bool(set(a.split(',')) & set(b.split(',')))) for a, b in zipped] 这也会产生错误 - df1['DIAG_CD']& df1['DIAG_CD'].shift(1)

TypeError:& 不支持的操作数类型:'list' 和 'list'

我是 python 和 pandas 的新手,非常感谢您的帮助。

这是我目前拥有的: </p> <pre><code>df = pd.read_parquet("samplefile.parquet", engine='pyarrow') print(df.head(20)) #remove newline characters df.replace(to_replace=[r"\t|\n|\r", "\t|\n|\r"], value=["",""], regex=True, inplace=True) df['intersection'] = [list(set(a).intersection(set(b))) for a, b in zip(df['DIAG_CD'], df['DIAG_CD'].shift(1))]

因为你似乎在每一行中存储列表,所以有很多方法可以做到这一点,但一种有效的方法是将列表变成集合并使用 not set(a).isdisjoint(b) 来测试他们是否有任何共享元素。因此,您可以执行以下操作:

for i in range(df.DIAG_CD.shape[0]-1):
    mutual_elements_exist = not set([df.DIAG_CD.iloc[i]]).isdisjoint([df.DIAG_CD.iloc[i+1]])
    print(f'Shared elements between row_{i}_and_row_{i+1} is {mutual_elements_exist}')

如果共享任何值,这将 return True,如果 none 共享,则 False。我添加了打印功能,因为目前还不清楚您希望通过它实现什么。也有很多不同的方法对结果进行分组,但由于缺乏信息,我就把它留在这里了。

编辑:我修改了问题并更改了它,以便您可以直接 运行 它。