Увеличение скорости итерации - PullRequest
0 голосов
/ 31 марта 2020

Добрый день,

Я перебираю огромный Dataframe (104062 x 20) со следующим кодом:

import pandas as pd

df_tot = pd.read_csv("C:\\Users\\XXXXX\\Desktop\\XXXXXXX\\LOGS\\DF_TOT.txt", header=None)

df_tot = df_tot.replace("\[", "", regex=True)
df_tot = df_tot.replace("\]", "", regex=True)
df_tot = df_tot.replace("\'", "", regex=True)

i = 0

while i < len(df_tot):
    to_compare = df_tot.iloc[i].tolist()

    for j in range(len(df_tot)):
        if to_compare == df_tot.iloc[j].tolist():

            if i == j:
                print('Matched itself.')
            else:
                print('MATCH FOUND - row: {} --- match row: {}'.format(i,j))

    i += 1

Я хочу оптимизировать потраченное время для каждой итерации в максимально возможной степени, поскольку этот код повторяется 104062 (^ 2) раза. (Более или менее десяти миллиардов итераций).

С моей вычислительной мощностью время, потраченное на сравнение to_compare во всем DF, составляет около 26 секунд.

Я хочу пояснить, что в случае, если это будет если потребуется, весь код можно изменить с помощью более быстрых конструкций.

Как обычно, Заранее спасибо.

1 Ответ

1 голос
/ 31 марта 2020

Насколько я понимаю, вы просто хотите найти дублированные строки.

Пример данных (дублируются 2 последние строки):

In [1]: df = pd.DataFrame([[1,2], [3,4], [5,6], [7,8], [1,2], [5,6]], columns=['a', 'b'])
        df
Out[1]: 
            a   b
        0   1   2
        1   3   4
        2   5   6
        3   7   8
        4   1   2
        5   5   6

Это вернет все дублированные строки:

In [2]: df[df.duplicated(keep=False)]
Out[2]: 
            a   b
       0    1   2
       2    5   6
       4    1   2
       5    5   6

И индексы, сгруппированные по дублированной строке:

In [3]: df[df.duplicated(keep=False)].reset_index().groupby(list(df.columns), as_index=False)['index'].apply(list)
Out[3]: a  b
        1  2    [0, 4]
        5  6    [2, 5]

Вы также можете просто удалить дубликаты из фрейма данных:

In [4]: df.drop_duplicates()
Out[4]:     
            a   b
        0   1   2
        1   3   4
        2   5   6
        3   7   8
...