Python 如何基于一列比较两个不同大小的数据帧?
我有两个大小不同的数据帧 df1 及 df2 1.我想根据“YearDeci”列比较df1和df2。并找出常用项和唯一项(常用行以外的行) 2.根据列'YearDeci'输出df1中的公共行(关于df2) 3.根据列'YearDeci'输出df1中唯一的行(关于df2) *NB:YearDeci'中小数点的差值在+/-0.0001以内是可以容忍的 预期输出如下所示 公用行=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
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中的索引
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])