【问题标题】:Fast remove element of list if contained by pandas dataframe如果包含在 pandas 数据帧中,则快速删除列表的元素
【发布时间】:2019-12-11 22:25:00
【问题描述】:

我有一个字符串列表和两个单独的 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

列标题都(不好)命名为 0。

应该删除补丁的第二个元素,因为它包含在 bad_patches 的第一行中。我的方法确实有效,但绝对需要很长时间。 Bad_patches 是 60,000 行,补丁的长度是可变的。现在,长度为 1000 个补丁需要 2.04 秒,但我需要扩展到 500k 个补丁,所以希望有更快的方法。谢谢!

【问题讨论】:

    标签: pandas list loops dataframe contains


    【解决方案1】:

    我将使用来自cloud_patchessnow_patches 的值创建一个集合。然后还创建了一组patches

    patch_set = set(cloud_patches[0]).union(set(snow_patches[0])
    patches = set(patches)
    

    现在您只需从patches 中的值减去patch_set 中的所有值,您将只剩下patches 中没有出现在cloud_patchessnow_patches 中的值:

    cleaned_list = list(patches - patch_set)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2022-01-04
      相关资源
      最近更新 更多