Разделение огромных данных и зацикливание одного и того же кода для всех порций данных. - PullRequest
0 голосов
/ 10 декабря 2018

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

df = pd.read_csv('dec 10.csv')
df1 = df.iloc[0:20000]
df2 = df.iloc[20000:40000]
df3 = df.iloc[40000:60000]
match1 = df1['Customer Name'].map(lambda x: difflib.get_close_matches(x, df1['Customer Name'].values, n=2, cutoff=0.8)).apply(pd.Series).dropna(axis=0)
match2 = df2['Customer Name'].map(lambda x: difflib.get_close_matches(x, df2['Customer Name'].values, n=2, cutoff=0.8)).apply(pd.Series).dropna(axis=0)
match3 = df3['Customer Name'].map(lambda x: difflib.get_close_matches(x, df3['Customer Name'].values, n=2, cutoff=0.8)).apply(pd.Series).dropna(axis=0)


a = match1.append(match2, ignore_index =True)
b = a.append(match3, ignore_index =True)

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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Ну, во-первых, вы можете разбить что-то на группы длиной n, например,

dfgroups = [df[x:x+n] for x in range(0, len(df), n)]

Замените 20000 на n, и вы получите куски не более 20 000 каждая.Затем вы можете зациклить свой код для каждого элемента в dfgroups.Также вам нужно, чтобы matches был его собственным списком, к которому вы можете добавить.И, наконец, для удобства чтения для такой длинной строки вы, вероятно, просто хотите написать mapper функцию, а не использовать массивную лямбду.

Собрав все это вместе, ваш код можно переписать следующим образом.

df = pd.read_csv('dec 10.csv')

# split df into groups of 20,000
dfgroups = [df[x:x+20000] for x in range(0, len(df), 20000)]
matches = [] # empty list to store matches

for dfgroup in dfgroups:

    # a function to replace that long line, more readable
    # this function will get redefined every loop, using the new `dfgroup` each iteration
    # this is optional, and you can instead keep that long line, replacing `df` with `dfgroup`
    def mapper(x):
        values = dfgroup['Customer Name'].values
        result = difflib.get_close_matches(x, values, n=2, cutoff=0.8))
        result = result.apply(pd.Series)
        result = result.dropna(axis=0)
        return result

    match = group['Customer Name'].map(mapper) # passing the function as an argument rather than using a lambda
    matches.append(match) # append it to the matches list

Теперь matches эквивалентно [match1, match2, match3, ...] и может использоваться как matches[0] matches[1] и т. Д.

0 голосов
/ 10 декабря 2018

Вы можете перебрать список фреймов данных, чтобы на каждой итерации вы просто ссылались на df и избегали дублирования кода:

match = pd.Dataframe()
for df in [df1,df2,df3]:
    match_ = df['Customer Name'].map(lambda x: difflib
                 .get_close_matches(x, df['Customer Name'].values, n=2, cutoff=0.8))
                 .apply(pd.Series).dropna(axis=0)
    match = match.append(match_, ignore_index =True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...