2015-11-09 6 views
1

У меня есть следующие функции, где ДФ является пандой dataframe что 159538 строк х 3 колонков:Как ускорить питон цикл

dfs = [] 
for i in df['email_address']: 
    data = df[df['email_address'] == i] 
    data['difference'] = data['ts_placed'].diff().astype('timedelta64[D]') 
    repeat = [] 
    for a in data['difference']: 
     if a > 10: 
      repeat.append(0) 
     elif a <= 10: 
      repeat.append(1) 
     else: 
      repeat.append(0) 
    data['repeat'] = repeat 
    dfs.append(data) 

функция работает очень медленно. Я хотел бы ускорить процесс, используя многопроцессорность. Это SO question показывает, как это сделать в R. Каков эквивалентный код для python?

это образец данных после запуска:

df['difference'] = df.groupby('email_address')['ts_placed'].diff() 



df 
Out[6]: 
          email_address   ts_placed  difference 
0     [email protected] 2015-08-06 00:00:34    NaT 
1    [email protected] 2015-08-06 00:05:38    NaT 
2  [email protected] 2015-08-06 00:09:20    NaT 
3     [email protected] 2015-08-06 00:10:01    NaT 
4  terry.wfdfdfdfdfy-holdings.co.uk 2015-08-06 00:14:00    NaT 
5    [email protected] 2015-08-06 00:14:00    NaT 
6     [email protected] 2015-08-06 00:14:00    NaT 
7   [email protected] 2015-08-06 00:14:20    NaT 
8     [email protected] 2015-08-06 00:14:43    NaT 
9    [email protected] 2015-08-06 00:17:03    NaT 
10    [email protected] 2015-08-06 00:17:58    NaT 
... 
22     [email protected] 2015-08-06 00:46:12 0 days 00:04:15 
+0

Это выглядит все, что вы делаете, группируя по адресам электронной почты, то вычисления ' diff' в этих группах, а затем назначить счетчик, если значение diff больше, чем '10' правильно? Также, если это 'pandas', то пометьте его так – EdChum

+0

да, это правильно –

+0

Можете ли вы отправить исходные данные и код для воспроизведения вашего df, чтобы избежать каких-либо неопределенностей – EdChum

ответ

1

IIUC, то вы можете сделать следующее:

df['difference'] = df.groupby('email_address')['ts_placed'].diff() 

df['repeat'] = df.groupby('email_address')['difference'].transform(lambda x: (x < 10).cumcount()) 
+0

Я получаю синтаксическую ошибку для второй строки –

+0

Можете ли вы опубликовать свои данные, код и ошибка, я ее отредактировал – EdChum

+0

это ошибка, которую я получаю AttributeError: объект 'Series' не имеет атрибута 'cumcount'. Я не могу отправлять данные из-за конфиденциальности. Однако столбец email_address является строкой, а столбец ts_placed - datetime64 [ns], оба из которых не имеют отсутствующих значений. С другой стороны, разность столбцов является timedelta64 [ns] и имеет несколько значений NaT –

Смежные вопросы