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

2024-09-30 05:32:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,其中包含DIAG_CD列中的列表(<;class‘list’>;):

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

            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”对象没有属性“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:不支持&;:'的操作数类型“列表”和“列表”

我对Python和熊猫很陌生,所以非常感谢您的帮助

这就是我目前拥有的:

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))]

Tags: 数据df列表shiftcdlistdiagsplit
1条回答
网友
1楼 · 发布于 2024-09-30 05:32:10

由于您似乎在每一行中存储列表,有许多方法可以实现这一点,但一种有效的方法是将列表转换为集合,并使用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}')

如果共享了任何值,则返回True;如果没有共享值,则返回False。我添加了打印功能,因为现在还不清楚你到底想用它实现什么。对结果进行分组的方法也有很多种,但由于缺乏信息,我就到此为止了

编辑:我已经修改了该问题,并对其进行了更改,以便您可以直接运行它

相关问题 更多 >

    热门问题