如果 pandas 数据框包含,则快速删除列表元素
Fast remove element of list if contained by pandas dataframe
我有一个字符串列表和两个单独的 pandas 数据帧。其中一个数据帧包含 NaN。我试图找到一种快速方法来检查列表中的任何项目是否包含在任一数据框中,如果是,则将其从列表中删除。
目前,我使用列表理解来执行此操作。我首先连接两个数据帧。然后我遍历列表,并使用 if 语句检查它是否包含在连接的数据帧值中。
patches = [patch for patch in patches if not patch in bad_patches.values]
我的字符串列表的前 5 个元素:
patches[1:5]
['S2A_MSIL2A_20170613T101031_11_52',
'S2A_MSIL2A_20170717T113321_35_89',
'S2A_MSIL2A_20170613T101031_12_39',
'S2A_MSIL2A_20170613T101031_11_77']
我的数据帧之一的示例,第二个数据帧相同但包含的行较少。注意第一行包含补丁[2].
cloud_patches.head()
0 S2A_MSIL2A_20170717T113321_35_89
1 S2A_MSIL2A_20170717T113321_39_84
2 S2B_MSIL2A_20171112T114339_0_13
3 S2B_MSIL2A_20171112T114339_0_52
4 S2B_MSIL2A_20171112T114339_0_53
连接的数据帧:
bad_patches = pd.concat([cloud_patches, snow_patches], axis=1)
bad_patches.head()
0 S2A_MSIL2A_20170717T113321_35_89 S2B_MSIL2A_20170831T095029_27_76
1 S2A_MSIL2A_20170717T113321_39_84 S2B_MSIL2A_20170831T095029_27_85
2 S2B_MSIL2A_20171112T114339_0_13 S2B_MSIL2A_20170831T095029_29_75
3 S2B_MSIL2A_20171112T114339_0_52 S2B_MSIL2A_20170831T095029_30_75
4 S2B_MSIL2A_20171112T114339_0_53 S2B_MSIL2A_20170831T095029_30_78
和尾部,显示一列的 NaN:
bad_patches.tail()
61702 NaN S2A_MSIL2A_20180228T101021_43_6
61703 NaN S2A_MSIL2A_20180228T101021_43_8
61704 NaN S2A_MSIL2A_20180228T101021_43_11
61705 NaN S2A_MSIL2A_20180228T101021_43_13
61706 NaN S2A_MSIL2A_20180228T101021_43_16
第 headers 列全部(错误地)命名为 0。
补丁的第二个元素应该被删除,因为它包含在 bad_patches 的第一行中。我的方法确实有效,但绝对需要很长时间。 Bad_patches 是 60,000 行,补丁的长度是可变的。现在,对于 1000 个补丁的长度,它需要 2.04 秒,但我需要扩展到 500k 个补丁,所以希望有更快的方法。谢谢!
我将使用 cloud_patches
和 snow_patches
中的值创建一个集合。然后也创建一组patches
:
patch_set = set(cloud_patches[0]).union(set(snow_patches[0])
patches = set(patches)
现在您只需从 patches
中的值中减去 patch_set
中的所有值,您将只剩下 patches
中没有出现在 [=12] 中的值=] 也不 snow_patches
:
cleaned_list = list(patches - patch_set)
我有一个字符串列表和两个单独的 pandas 数据帧。其中一个数据帧包含 NaN。我试图找到一种快速方法来检查列表中的任何项目是否包含在任一数据框中,如果是,则将其从列表中删除。
目前,我使用列表理解来执行此操作。我首先连接两个数据帧。然后我遍历列表,并使用 if 语句检查它是否包含在连接的数据帧值中。
patches = [patch for patch in patches if not patch in bad_patches.values]
我的字符串列表的前 5 个元素:
patches[1:5]
['S2A_MSIL2A_20170613T101031_11_52',
'S2A_MSIL2A_20170717T113321_35_89',
'S2A_MSIL2A_20170613T101031_12_39',
'S2A_MSIL2A_20170613T101031_11_77']
我的数据帧之一的示例,第二个数据帧相同但包含的行较少。注意第一行包含补丁[2].
cloud_patches.head()
0 S2A_MSIL2A_20170717T113321_35_89
1 S2A_MSIL2A_20170717T113321_39_84
2 S2B_MSIL2A_20171112T114339_0_13
3 S2B_MSIL2A_20171112T114339_0_52
4 S2B_MSIL2A_20171112T114339_0_53
连接的数据帧:
bad_patches = pd.concat([cloud_patches, snow_patches], axis=1)
bad_patches.head()
0 S2A_MSIL2A_20170717T113321_35_89 S2B_MSIL2A_20170831T095029_27_76
1 S2A_MSIL2A_20170717T113321_39_84 S2B_MSIL2A_20170831T095029_27_85
2 S2B_MSIL2A_20171112T114339_0_13 S2B_MSIL2A_20170831T095029_29_75
3 S2B_MSIL2A_20171112T114339_0_52 S2B_MSIL2A_20170831T095029_30_75
4 S2B_MSIL2A_20171112T114339_0_53 S2B_MSIL2A_20170831T095029_30_78
和尾部,显示一列的 NaN:
bad_patches.tail()
61702 NaN S2A_MSIL2A_20180228T101021_43_6
61703 NaN S2A_MSIL2A_20180228T101021_43_8
61704 NaN S2A_MSIL2A_20180228T101021_43_11
61705 NaN S2A_MSIL2A_20180228T101021_43_13
61706 NaN S2A_MSIL2A_20180228T101021_43_16
第 headers 列全部(错误地)命名为 0。
补丁的第二个元素应该被删除,因为它包含在 bad_patches 的第一行中。我的方法确实有效,但绝对需要很长时间。 Bad_patches 是 60,000 行,补丁的长度是可变的。现在,对于 1000 个补丁的长度,它需要 2.04 秒,但我需要扩展到 500k 个补丁,所以希望有更快的方法。谢谢!
我将使用 cloud_patches
和 snow_patches
中的值创建一个集合。然后也创建一组patches
:
patch_set = set(cloud_patches[0]).union(set(snow_patches[0])
patches = set(patches)
现在您只需从 patches
中的值中减去 patch_set
中的所有值,您将只剩下 patches
中没有出现在 [=12] 中的值=] 也不 snow_patches
:
cleaned_list = list(patches - patch_set)