[英]How to compare each row of a column to all the other row of the same column of a large dataset in python?
我有一个 dataframe,它有两列 - unique_id 和 id_string。dataframe 看起来像:
| unique_id| id_string |
| -------- | --------- |
| 123 | abc |
| 456 | pqr |
| 789 | xyz |
| 000 | lmn |
我想将每个 unique_id 的 id_string 与该列的所有其他 id_string 进行比较。 我希望 output 如下表所示:
| unique_id| id_string | duplicate_id|duplicate_string|score|
| -------- | --------- |-------------|----------------|-----|
| 123 | abc |456 |pqr |91 |
| 123 | abc |789 |xyz |92 |
| 123 | abc |000 |lmn |93 |
我已经使用下面的 for 循环编写了代码:
out_put_df = pd.DataFrame()
for i in input_df.index:
unique_id = input_df.at[i, 'unique_id']
id_string = input_df.at[i, 'id_string']
j = i+1
for j in range(len(input_df.index)-j):
dupicate_id = input_df.at[j, 'unique_id']
duplicate_string = input_df.at[j, 'id_string']
comparition_score = fuzz.token_set_ratio(id_string, duplicate_string)
out_put_df = out_put_df.append(pd.DataFrame({'unique_id': unique_id,'id_string': id_string,'dupicate_id': dupicate_id,'duplicate_string': duplicate_string,'comparition_score': comparition_score}, index=[0]), ignore_index=True)
原来的 dataframe 有 50 万行,所以它需要无限的时间。 有人可以告诉我这样做的最佳方法吗? 我开始了解它 itertools.combinations,但我也无法使用它。
提前致谢。
你应该使用排序。 按id_string
列排序并遍历所有行 - 只要id_string
列中的下一个值等于当前值 - 你就有一个重复项。 您还可以使用id_string
的最后一个值回顾(这可能更容易):
input_df = pd.DataFrame()
prev_id_string = None # or some other invalid value that does not exist in your df
prev_unique_id = None
rows = []
for _, (unique_id, id_string) in input_df.sort_values(by=['id_string', 'unique_id']).iterrows():
if prev_id_string == id_string:
score = # calculate it as you wish
row.append((prev_unique_id, prev_id_string, unique_id, score))
prev_unique_id = unique_id
out_put_df = pd.DataFrame(columns="unique_id, id_string, duplicate_id, duplicate_string, score".split(", "), data=rows)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.