如何根据列比较两个不同大小的数据框?
How to compare two data frames of different size based on a column?
我有两个不同大小的数据框
df1
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
2 1720.535519 1720 7 15 ... 6.5 28.37 77.09
3 1734.997260 1734 12 31 ... 7.5 34.00 75.00
4 1777.997260 1777 12 31 ... 7.7 34.00 75.00
和
df2
YearDeci Year Month Day Hour ... Seconds Mb Lat Lon
0 1669.510753 1669 6 4 0 ... 0 NaN 33.400 73.200
1 1720.535519 1720 7 15 0 ... 0 NaN 28.700 77.200
2 1780.000000 1780 0 0 0 ... 0 NaN 35.000 77.000
3 1803.388014 1803 5 22 15 ... 0 NaN 30.600 78.600
4 1803.665753 1803 9 1 0 ... 0 NaN 30.300 78.800
5 1803.388014 1803 5 22 15 ... 0 NaN 30.600 78.600.
1.I 想根据 'YearDeci' 列比较 df1 和 df2。并找出公共条目和唯一条目(公共行以外的行)。
2.output df1 中基于列 'YearDeci'.
的公共行(相对于 df2)
3.output df1 中基于列 'YearDeci'.
的唯一行(相对于 df2)
*注意:'YearDeci' 中小数值的差异高达 +/-0.0001 是可以容忍的
预期的输出就像
row_common=
YearDeci Year Month Day ... Mb Lat Lon
2 1720.535519 1720 7 15 ... 6.5 28.37 77.09
row_unique=
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 在 "each with each"
原则。
要执行比较,请使用 np.isclose 函数和假定的绝对值
公差。
结果是一个布尔值数组:
- 第一个索引 - df1,
中的索引
- 第二个索引 - df2.
中的索引
然后,使用np.argwhere,找到True值的索引,即索引
来自 df1 和 df2 的 "correlated" 行,并从中创建一个 DateFrame。
执行上述操作的代码是:
ind = pd.DataFrame(np.argwhere(np.isclose(df1.YearDeci[:, np.newaxis],
df2.YearDeci[np.newaxis, :], atol=0.0001, rtol=0)),
columns=['ind1', 'ind2'])
然后,在两个 DataFrame 中都有指向 "correlated" 行的索引对,
执行以下合并:
result = ind.merge(df1, left_on='ind1', right_index=True)\
.merge(df2, left_on='ind2', right_index=True, suffixes=['_1', '_2'])
最后一步是同时删除 "auxiliary index columns"(ind1 和 ind2):
result.drop(columns=['ind1', 'ind2'], inplace=True)
结果(分为2部分)是:
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
普通行的索引已经在变量ind中
所以要找到唯一的条目,我们需要做的就是根据 "ind" 中的索引从 df1 中删除公共行
所以最好让另一个 CSV 文件包含公共条目并将其读取到变量中。
df1_common = pd.read_csv("df1_common.csv")
df1_uniq = df1.drop(df1.index[ind.ind1])
我有两个不同大小的数据框
df1
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
2 1720.535519 1720 7 15 ... 6.5 28.37 77.09
3 1734.997260 1734 12 31 ... 7.5 34.00 75.00
4 1777.997260 1777 12 31 ... 7.7 34.00 75.00
和
df2
YearDeci Year Month Day Hour ... Seconds Mb Lat Lon
0 1669.510753 1669 6 4 0 ... 0 NaN 33.400 73.200
1 1720.535519 1720 7 15 0 ... 0 NaN 28.700 77.200
2 1780.000000 1780 0 0 0 ... 0 NaN 35.000 77.000
3 1803.388014 1803 5 22 15 ... 0 NaN 30.600 78.600
4 1803.665753 1803 9 1 0 ... 0 NaN 30.300 78.800
5 1803.388014 1803 5 22 15 ... 0 NaN 30.600 78.600.
1.I 想根据 'YearDeci' 列比较 df1 和 df2。并找出公共条目和唯一条目(公共行以外的行)。
2.output df1 中基于列 'YearDeci'.
的公共行(相对于 df2)3.output df1 中基于列 'YearDeci'.
的唯一行(相对于 df2)*注意:'YearDeci' 中小数值的差异高达 +/-0.0001 是可以容忍的
预期的输出就像
row_common=
YearDeci Year Month Day ... Mb Lat Lon
2 1720.535519 1720 7 15 ... 6.5 28.37 77.09
row_unique=
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 在 "each with each" 原则。 要执行比较,请使用 np.isclose 函数和假定的绝对值 公差。
结果是一个布尔值数组:
- 第一个索引 - df1, 中的索引
- 第二个索引 - df2. 中的索引
然后,使用np.argwhere,找到True值的索引,即索引 来自 df1 和 df2 的 "correlated" 行,并从中创建一个 DateFrame。
执行上述操作的代码是:
ind = pd.DataFrame(np.argwhere(np.isclose(df1.YearDeci[:, np.newaxis],
df2.YearDeci[np.newaxis, :], atol=0.0001, rtol=0)),
columns=['ind1', 'ind2'])
然后,在两个 DataFrame 中都有指向 "correlated" 行的索引对, 执行以下合并:
result = ind.merge(df1, left_on='ind1', right_index=True)\
.merge(df2, left_on='ind2', right_index=True, suffixes=['_1', '_2'])
最后一步是同时删除 "auxiliary index columns"(ind1 和 ind2):
result.drop(columns=['ind1', 'ind2'], inplace=True)
结果(分为2部分)是:
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
普通行的索引已经在变量ind中
所以要找到唯一的条目,我们需要做的就是根据 "ind" 中的索引从 df1 中删除公共行 所以最好让另一个 CSV 文件包含公共条目并将其读取到变量中。
df1_common = pd.read_csv("df1_common.csv")
df1_uniq = df1.drop(df1.index[ind.ind1])