【发布时间】:2020-07-21 00:42:41
【问题描述】:
根据测量不准确从数据中删除相似的重复项
我正在努力解决 Python 中用于过滤重复数据的新问题。 我特别想在超过 100 行和超过 25 列的大数据上使用它。
使用以下数据框简化为一个简单的示例:
>>> df
a b c d
0 1.764052 0.400157 0.978738 2.240893
1 1.764052 0.400157 0.978738 2.240893
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 -0.103219 0.410599 0.144044 1.454274
5 1.230291 1.202380 -0.387327 -0.302303
6 1.230291 1.202380 -0.387327 -0.302303
7 1.532779 1.469359 0.154947 0.378163
8 1.230291 1.202380 -0.387327 -0.302303
9 1.230291 1.202380 -0.387327 -0.302303
>>> df1 = df.drop_duplicates()
a b c d
0 1.764052 0.400157 0.978738 2.240893
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 -0.103219 0.410600 0.144044 1.454274
5 1.240291 1.202380 -0.387327 -0.302303
7 1.532779 1.469359 0.154947 0.378163
8 1.230291 1.202380 -0.387327 -0.302303
>>> df2 = df. spezial code ?
a b c d
0 1.764052 0.400157 0.978738 2.240893
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
5 1.240291 1.202380 -0.387327 -0.302303
7 1.532779 1.469359 0.154947 0.378163
8 1.230291 1.202380 -0.387327 -0.302303
所以pandas 中的drop.duplicates() 非常高效、超快速且运行良好。
但它只过滤完全相同的重复项。
但是为了最小化日期并查看测量误差,我还想删除相似的数据,并且基于定义的测量误差相同。
因此也应该删除与列c 中的第2 行“几乎”相同的第4 行。
另一方面,它应该保留在第 8 行,这与第 5 行(在 a 列中)相似,但不是在测量不准确方面。
遵循解决小数据问题的可能性,但不幸的是,这会导致处理大数据的速度变慢。
tolerances = {'a':0.001,
'b':0.5,
'c':0.5,
'd':0.05}
df_clean = pd.DataFrame(columns=df.columns.to_list())
df_clean = df_clean.append(df.iloc[1])
for i in range(df.shape[0]):
for j in range(df_clean.shape[0]):
m = 0
for key in tolerances:
if ((df.iloc[i].loc[key] <= df_clean.iloc[j].loc[key]+tolerances[key]) and (df.iloc[i].loc[key] >= df_clean.iloc[j].loc[key]-tolerances[key])):
m = m+1
else:
break
if m == len(tolerances):
break
if j == (df_clean.shape[0]-1):
df_clean = df_clean.append(df.iloc[i])
df_clean.sort_index(inplace=True)
>>> print(df_clean)
a b c d
0 1.764052 0.400157 0.978738 2.240893
1 -0.103219 0.410599 0.144044 1.454274
2 0.761038 0.121675 0.443863 0.333674
4 1.240291 1.202380 -0.387327 -0.302303
5 1.532779 1.469359 0.154947 0.378163
6 1.230291 1.202380 -0.387327 -0.302303
【问题讨论】:
-
您的意思是要删除足够相似的行?为此,您需要知道要使用的距离(相似)以及阈值(足够)。距离的自然示例是欧几里得距离或余弦相似度。在您的情况下,似乎 > 95% 的高阈值可以完成这项工作。
-
没错。距离取决于行,因此某些值应以 0.1 的精度过滤,而其他值应在 0.01 左右。
标签: python python-3.x dataframe filter duplicates