我有一个名为pd的Pandas数据框。我正在尝试使用嵌套循环来遍历数据帧的每个元组,并在每次迭代时将元组与帧中的所有其他元组进行比较。在比较步骤中,我正在使用Python的difflib.SequenceMatcher()。ratio()并删除具有高度相似性(比率> 0.8)的元组。
问题: 不幸的是,在第一次外循环迭代之后,我收到了KeyError。
我怀疑通过删除元组,我使外循环的索引器无效。或者,我通过尝试访问不存在(已删除)的元素来使内循环的索引器无效。
以下是代码:
import json
import pandas as pd
import pyreadline
import pprint
from difflib import SequenceMatcher
# Note, this file, 'tweetsR.json', was originally csv, but has been translated to json.
with open("twitter data/tweetsR.json", "r") as read_file:
data = json.load(read_file) # Load the source data set, esport tweets.
df = pd.DataFrame(data) # Load data into a pandas(pd) data frame for pandas utilities.
df = df.drop_duplicates(['text'], keep='first') # Drop tweets with identical text content. Note,
these tweets are likely reposts/retweets, etc.
df = df.reset_index(drop=True) # Adjust the index to reflect dropping of duplicates.
def duplicates(df):
for ind in df.index:
a = df['text'][ind]
for indd in df.index:
if indd != 26747: # Trying to prevent an overstep keyError here
b = df['text'][indd+1]
if similar(a,b) >= 0.80:
df.drop((indd+1), inplace=True)
print(str(ind) + "Completed") # Debugging statement, tells us which iterations have completed
duplicates(df)
有人可以帮助我理解和/或解决它吗?
答案 0 :(得分:2)
itertools.combination()是@KazuyaHatta提到的一种解决方案。虽然,我使用它的方式(可能有另一种方式),但是它是O(n ^ 2)。因此,在这种情况下,如果有27,000个元组,则要迭代的组合数量将近357,714,378个(太长)。
以下是代码:
# Create a set of the dropped tuples and run this code on bizon overnight.
def duplicates(df):
# Find out how to improve the speed of this
excludes = set()
combos = itertools.combinations(df.index, 2)
for combo in combos:
if str(combo) not in excludes:
if similar(df['text'][combo[0]], df['text'][combo[1]]) > 0.8:
excludes.add(f'{combo[0]}, {combo[1]}')
excludes.add(f'{combo[1]}, {combo[0]}')
print("Dropped: " + str(combo))
print(len(excludes))
duplicates(df)
@KazuyaHatta描述了我的下一步,就是尝试使用基于掩码的放置方法。
注意:很遗憾,我无法发布该数据集的样本。