如何比较数据框相邻行中列表中的任何项目是否匹配
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
。我添加了打印功能,因为目前还不清楚您希望通过它实现什么。也有很多不同的方法对结果进行分组,但由于缺乏信息,我就把它留在这里了。
编辑:我修改了问题并更改了它,以便您可以直接 运行 它。
我有一个 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
。我添加了打印功能,因为目前还不清楚您希望通过它实现什么。也有很多不同的方法对结果进行分组,但由于缺乏信息,我就把它留在这里了。
编辑:我修改了问题并更改了它,以便您可以直接 运行 它。