Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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 如何基于一列比较两个不同大小的数据帧?_Python_R_Pandas_Comparison - Fatal编程技术网

Python 如何基于一列比较两个不同大小的数据帧?

Python 如何基于一列比较两个不同大小的数据帧?,python,r,pandas,comparison,Python,R,Pandas,Comparison,我有两个大小不同的数据帧 df1 及 df2 1.我想根据“YearDeci”列比较df1和df2。并找出常用项和唯一项(常用行以外的行) 2.根据列'YearDeci'输出df1中的公共行(关于df2) 3.根据列'YearDeci'输出df1中唯一的行(关于df2) *NB:YearDeci'中小数点的差值在+/-0.0001以内是可以容忍的 预期输出如下所示 公用行= YearDeci Year Month Day ... Mb Lat Lon

我有两个大小不同的数据帧

df1

df2

1.我想根据“YearDeci”列比较df1和df2。并找出常用项和唯一项(常用行以外的行)

2.根据列'YearDeci'输出df1中的公共行(关于df2)

3.根据列'YearDeci'输出df1中唯一的行(关于df2)

*NB:YearDeci'中小数点的差值在+/-0.0001以内是可以容忍的

预期输出如下所示

公用行=

      YearDeci     Year   Month  Day ...   Mb     Lat     Lon 
2     1720.535519  1720      7   15  ...  6.5  28.37  77.09
行_唯一=

      YearDeci  Year  Month  Day  ...  Magnitude    Lat    Lon  
0     1551.997260  1551     12   31  ...        7.5  34.00  74.50      
1     1661.997260  1661     12   31  ...        7.5  34.00  75.00           
3     1734.997260  1734     12   31  ...        7.5  34.00  75.00      
4     1777.997260  1777     12   31  ...        7.7  34.00  75.00 
首先在“每个都有”上比较df1.YearDeci和df2.YearDeci 原则。 要执行比较,请使用np.isclose函数和假定的绝对值 宽容

结果是一个布尔数组:

  • 第一个索引—df1中的索引
  • 第二个索引—df2中的索引
然后,使用np.argwhere查找真值的索引,即索引 从df1和df2中选择“相关”行,并从中创建日期框

执行上述操作的代码为:

ind = pd.DataFrame(np.argwhere(np.isclose(df1.YearDeci[:, np.newaxis],
    df2.YearDeci[np.newaxis, :], atol=0.0001, rtol=0)),
    columns=['ind1', 'ind2'])
然后,在两个数据帧中都有指向“相关”行的成对索引, 执行以下合并:

result = ind.merge(df1, left_on='ind1', right_index=True)\
    .merge(df2, left_on='ind2', right_index=True, suffixes=['_1', '_2'])
最后一步是删除两个“辅助索引列”(ind1和ind2):

结果(分为两部分)为:


常用行的索引已在变量ind中

因此,要找到唯一的条目,我们只需根据“ind”中的索引从df1中删除公共行 因此,最好让另一个CSV文件包含公共条目,并将其读取到变量中

df1_common = pd.read_csv("df1_common.csv")

df1_uniq = df1.drop(df1.index[ind.ind1])

可能是数据帧大小的
merge\u asof
可能重复?df1[9000行x 27列]df2[6000行x 11列]非常感谢您的回答!我只是好奇pandas的datacompy可以显著降低代码的复杂性?是的,使用Numpy方法有时可以显著提高执行速度。我在这里使用了一个基于np.newaxis的技巧,它允许使用Numpy广播,它比两个“普通”嵌套循环运行得更快,在两个数据帧中都运行YearDeci列。所以别忘了Numpy,它有可能加快你的计算速度。我应该在第一行代码(ind)中做什么更改来获得错误值,即df1和df2中不相关的行?在“np.isclose”之前添加“~”(而不是orerator)。其思想是对该函数生成的数组求反。但是你会有很多这样的行对。是的,我已经试过了,但正如你提到的,我最终会有很多行,我还需要得到两个数据帧的补充。对代码进行简单的修改不会让我达到目的?
result = ind.merge(df1, left_on='ind1', right_index=True)\
    .merge(df2, left_on='ind2', right_index=True, suffixes=['_1', '_2'])
result.drop(columns=['ind1', 'ind2'], inplace=True)
    YearDeci_1  Year_1  Month_1  Day_1  Magnitude  Lat_1  Lon_1   YearDeci_2  \
0  1720.535519    1720        7     15        6.5  28.37  77.09  1720.535519   

   Year_2  Month_2  Day_2  Hour  Seconds  Mb  Lat_2  Lon_2  
0    1720        7     15     0        0 NaN   28.7   77.2  
df1_common = pd.read_csv("df1_common.csv")

df1_uniq = df1.drop(df1.index[ind.ind1])