我有一个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))]
由于您似乎在每一行中存储列表,有许多方法可以实现这一点,但一种有效的方法是将列表转换为集合,并使用
not set(a).isdisjoint(b)
测试它们是否有任何共享元素。因此,您可以执行以下操作:如果共享了任何值,则返回
True
;如果没有共享值,则返回False
。我添加了打印功能,因为现在还不清楚你到底想用它实现什么。对结果进行分组的方法也有很多种,但由于缺乏信息,我就到此为止了编辑:我已经修改了该问题,并对其进行了更改,以便您可以直接运行它
相关问题 更多 >
编程相关推荐