Pandas-KeyError-在嵌套循环中按索引删除行

时间:2019-12-19 23:35:27

标签: python pandas

我有一个名为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)

错误输出: enter image description here

有人可以帮助我理解和/或解决它吗?

1 个答案:

答案 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描述了我的下一步,就是尝试使用基于掩码的放置方法。

注意:很遗憾,我无法发布该数据集的样本。