Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas有效地找到两个大数据帧之间的逆交集?_Python_Pandas_Dataframe_Bigdata_Intersection - Fatal编程技术网

Python 如何使用pandas有效地找到两个大数据帧之间的逆交集?

Python 如何使用pandas有效地找到两个大数据帧之间的逆交集?,python,pandas,dataframe,bigdata,intersection,Python,Pandas,Dataframe,Bigdata,Intersection,我试图找到两个大数据帧之间的逆交集。 我把它和以后剪掉的代码一起使用。不幸的是,这种方法在大数据帧上“太慢”,下面将进一步描述。你能想出一个更快的方法来计算这个结果吗 import pandas as pd df_1 = pd.DataFrame({'a': [8, 2, 2], 'b': [0, 1, 3], 'c': [0, 2, 2], 'd': [0, 2, 2

我试图找到两个大数据帧之间的逆交集。 我把它和以后剪掉的代码一起使用。不幸的是,这种方法在大数据帧上“太慢”,下面将进一步描述。你能想出一个更快的方法来计算这个结果吗

import pandas as pd

df_1 = pd.DataFrame({'a': [8, 2, 2],
                     'b': [0, 1, 3],
                     'c': [0, 2, 2],
                     'd': [0, 2, 2],
                     'e': [0, 2, 2]})

df_2 = pd.DataFrame({'a': [8, 2, 2, 2, 8, 2],
                     'b': [0, 1, 1, 6, 0, 1],
                     'c': [0, 3, 2, 2, 0, 2],
                     'd': [0, 4, 2, 2, 0, 4],
                     'e': [0, 1, 2, 2, 0, 2]})

l_columns = ['a','b','e']

def df_drop_df(df_1, df_2, l_columns):
    """
    Eliminates all equal rows present in dataframe 1 (df_1) from dataframe 2 (df_2) depending on a subset of columns (l_columns)

    :param df_1: dataframe that defines which rows to be removed
    :param df_2: dataframe that is reduced
    :param l_columns: list of column names, present in df_1 and df_2, that is used for the comparison

    :return df_out: final dataframe
    """
    df_1r = df_1[l_columns]
    df_2r = df_2[l_columns].reset_index()

    df_m = pd.merge(df_1r, df_2r, on=l_columns, how='inner')
    row_indexes_m = df_m['index'].to_list()

    row_indexes_df_2 = df_2.index.to_list()
    row_indexes_out = [x for x in row_indexes_df_2 if x not in row_indexes_m]

    df_out = df_2.loc[row_indexes_out]
    return df_out
给出以下正确结果:

#row_indexes_out = [1,3]

df_output = df_drop_df(df_1, df_2, l_columns)
df_output

({'a': [2, 2],
  'b': [1, 6],
  'c': [3, 2],
  'd': [4, 2],
  'e': [1, 2]})
但是,对于实际应用程序,数据帧的大小具有以下维度,在本地计算机上计算大约需要30分钟:

变量 形状 df1 (3300,77) df2 (642000,77) l_柱 清单12 德福 (611000,77)
您可以尝试替换以下行:

row_indexes_df_2 = df_2.index.to_list()
row_indexes_out = [x for x in row_indexes_df_2 if x not in row_indexes_m]

df_out = df_2.loc[row_indexes_out]
由tilde操作符执行:

df_out = df_2.loc[~df_2.index.isin(row_indexes_m)]

这将大大减少时间。

您是否在寻找这两个数据帧相对于公共列的交集的补集?是的,交集的补集比我所称的(反向交集)更正确。需要这么长时间的应该是合并步骤,而不是问题的反转,对吗?它不仅是所有的公共列,而且是特定列(这两个数据帧都需要有公共列)。您是否完全确定您得到的实际上是交叉点的补充,因为您使用的列是键?我得到一个额外的行,我只使用补语的定义。你能发布你在做什么吗?结果应该是第1行和第3行,因为这两个数据帧在a列、b列和ETH列上进行了比较。现在,在我的本地机器上,这一步骤在大型数据帧上只需要0.5秒。