如何根据 single/multiple 列值在具有给定容差的数据框中查找重复行?
How to find duplicate rows in a dataframe with given tolerance based on a single/multiple column value?
是通过比较基于列值的两个数据帧来列出重复值的建议解决方案。如何通过考虑给定的公差并将其列在新数据框中来做同样的事情来查找数据框本身中包含的重复行?
df
YearDeci Year Month Day Hour ... Seconds Mb Lat Lon
0 1669.510 1669 6 4 0 ... 0 NaN 33.400 73.200
1 1720.535 1720 7 15 0 ... 0 NaN 28.700 77.200
2 1780.000 1780 0 0 0 ... 0 NaN 35.000 77.000
3 1669.511 1669 6 4 0 ... 0 NaN 33.400 73.200
4 1803.665 1803 9 1 0 ... 0 NaN 30.300 78.800
5 1803.388 1803 5 22 15 ... 0 NaN 30.600 78.600.
如果我们根据 YearDeci
查找重复行,容差级别为 0.002
expected output
1669.510 1669 6 4 0 ... 0 NaN 33.400 73.200 3
1669.511 1669 6 4 0 ... 0 NaN 33.400 73.200
或者只是它的索引
index1 index2
0 3
- 首先按要查找的行在彼此
0.002
范围内的列对数据框进行排序。
- 然后,您可以使用
.diff()
查找行之间的差异,如果 .diff() is < 0.002
则进行筛选。您还必须使用 .shift(-1)
: 获取其上方的另一行
df = df.sort_values('YearDeci')
s = df['YearDeci'].diff() < 0.002
df[s | s.shift(-1)]
Out[1]:
YearDeci Year Month Day Hour ... Seconds Mb Lat Lon
0 1669.510 1669 6 4 0 ... 0 NaN 33.4 73.200
3 1669.511 1669 6 4 0 ... 0 NaN 33.4 73.200
获取索引值:
df[(s | s.shift(-1))].index.tolist()
# OR [*df[(s | s.shift(-1))].index]
[0, 3]
df
YearDeci Year Month Day Hour ... Seconds Mb Lat Lon
0 1669.510 1669 6 4 0 ... 0 NaN 33.400 73.200
1 1720.535 1720 7 15 0 ... 0 NaN 28.700 77.200
2 1780.000 1780 0 0 0 ... 0 NaN 35.000 77.000
3 1669.511 1669 6 4 0 ... 0 NaN 33.400 73.200
4 1803.665 1803 9 1 0 ... 0 NaN 30.300 78.800
5 1803.388 1803 5 22 15 ... 0 NaN 30.600 78.600.
如果我们根据 YearDeci
查找重复行,容差级别为 0.002
expected output
1669.510 1669 6 4 0 ... 0 NaN 33.400 73.200 3
1669.511 1669 6 4 0 ... 0 NaN 33.400 73.200
或者只是它的索引
index1 index2
0 3
- 首先按要查找的行在彼此
0.002
范围内的列对数据框进行排序。 - 然后,您可以使用
.diff()
查找行之间的差异,如果.diff() is < 0.002
则进行筛选。您还必须使用.shift(-1)
: 获取其上方的另一行
df = df.sort_values('YearDeci')
s = df['YearDeci'].diff() < 0.002
df[s | s.shift(-1)]
Out[1]:
YearDeci Year Month Day Hour ... Seconds Mb Lat Lon
0 1669.510 1669 6 4 0 ... 0 NaN 33.4 73.200
3 1669.511 1669 6 4 0 ... 0 NaN 33.4 73.200
获取索引值:
df[(s | s.shift(-1))].index.tolist()
# OR [*df[(s | s.shift(-1))].index]
[0, 3]