【问题标题】:Pandas DataFrame how to compare each cell of a colum with each cell of another column in another dataframe and drop matching onesPandas DataFrame如何将一列的每个单元格与另一个数据框中另一列的每个单元格进行比较并删除匹配的单元格
【发布时间】:2022-09-06 04:16:05
【问题描述】:

我有一个巨大的数据框(D1),它只是一列 ID(大约 700,000),我还有另一个数据框(D2),其中包含与人相关的数据,其中一个列代表和 ID。 我需要将 D2 的 ID 列中的每个单元格与 D1 列中的每个值进行比较。必须从 D2 中删除具有匹配 ID 的行。

这是我用来比较和删除的代码部分,但我认为我没有正确使用 drop 函数。由于数据帧太大,我的电脑或谷歌 colab 因内存不足而崩溃,我不得不将 D2 划分为较小的数据帧并将它们添加到字典(dataframe_collection)中,然后再次使用该字典将其每个迷你数据帧加入一个更大的并打印一个csv文件。 发生的事情是较小的数据帧总是空的,我能够识别两个数据帧中存在哪些 ID,哪些不存在。

times = math.ceil(D2.shape[0]/500)
print(times)
dataframe_collection = {}

for i in range(times):
  dataframe_collection[i] = D2.iloc[i*500: (i*500)+500]
  dataframe_collection[i] = dataframe_collection[i].drop(dataframe_collection[i][dataframe_collection[i]["ID"] == D1].index)

数据集示例:

data1 = ['23100100011930000021', '23100100011930000031','23100100011930000061','23100100011930000081','23100100011930000091','23100100011930000101','23100100011930000181']
D1 = pd.DataFrame(data1, columns=['ID'])


data2 = [['tom', '23100100011930000021', 'USA'], ['nick', '23100100011930000031', 'DEU'], ['juli', '23100100011930000061', 'USA'], ['charlie', '23100100011930000722', 'MEX']]
D2 = pd.DataFrame(data2, columns=['Name', 'Age', 'Country'])

在这种情况下,最后一个寄存器 ['charlie', '23100100011930000722', 'MEX'] 应留在最终数据帧中,其他寄存器应丢弃

【问题讨论】:

  • 小数据集作为示例会很方便,但是,看起来您应该使用与此类似的解决方案:stackoverflow.com/a/37246977/8805842
  • @NoobVB 是的,它与那个问题非常相似。我尝试在 excel 上执行此操作,但它崩溃了,由于数据量过多,它甚至不允许我过滤单元格,这就是为什么我尝试用 python 解决它但无法这样做的原因。

标签: python pandas dataframe compare drop


【解决方案1】:

我认为这就是你要找的:

D2 = D2.loc[~D2.Age.isin(D1.ID)]

【讨论】:

  • 试过了,没用。由于某种原因,它没有采用 D1 ID 的每个值。如果我显式地写入诸如 .isin(['122122121']) 之类的值,它会起作用,但通过传递数据框列不起作用。知道是什么原因造成的吗?
  • 两列的类型是否相同?
  • 是的,我什至尝试将它们转换为相同的类型并且它做了同样的事情。我认为这与它无法与系列正常工作有关,它必须与诸如 [x] 之类的列表有关。我将最大的数据框转换为一个列表,现在它需要很长时间才能停止。我会尝试像其他数据框一样让它更小,希望能解决它。
  • 它起作用了,一个数据框中的 ID 列存在一些不一致,并且值不一样,有一个额外的空间。感谢您帮助 josepn。
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多