Понимание списка и оптимизация скорости - PullRequest
1 голос
/ 30 сентября 2019

У меня есть фрейм данных pandas, в рамках фрейма данных у меня есть две серии / столбцы, которые я хочу объединить в новую серию / столбец. У меня уже есть цикл for, который делает то, что мне нужно, но я бы предпочел, чтобы это было в понимании списка, но я не могу понять это. Кроме того, мой код занимает значительное количество времени для выполнения. Я читал, что понимание списка выполняется быстрее, может быть, есть более быстрый способ?

Если значения из 'lead_owner' совпадают с уникальными / уникальными значениями из 'agent_final', используйте это значение. В противном случае используйте значения из 'agent_final'

for x, y in zip(list(df['lead_owner']), list(df['agent_final'])):
    if x in set(df['agent_final']):
        my_list .append(x)
    else:
        my_list .append(y)

Ответы [ 4 ]

2 голосов
/ 30 сентября 2019

Способ сделать это, используя понимание списка:

my_list = [x if x in set(df['agent_final']) else y for (x,y) in zip(list(df['lead_owner']), list(df['agent_final']))]

Довольно сложно сказать, почему ваш код работает медленно, если я не знаю, каков размер ваших данных.

Один из способов ускорения вашего кода - не создавать набор каждый раз, когда вы проверяете, присутствует ли x в наборе. Создайте набор за пределами понимания цикла / списка:

agent_final_set = set(df['agent_final'])
my_list = [x if x in agent_final_set else y for (x,y) in zip(list(df['lead_owner']), list(df['agent_final']))]
1 голос
/ 30 сентября 2019

Я удалил некоторый ненужный код и извлек создание набора вне основного цикла. Давайте посмотрим, будет ли это работать быстрее:

agents = set(df['agent_final'])
data = zip(df['lead_owner'], df['agent_final'])
result = [x if x in agents else y for x, y in data]
0 голосов
/ 30 сентября 2019

Я бы посоветовал вам попробовать панд apply и поделиться результатами:

agents = set(df['agent_final'])
df['result'] = df.apply(lambda x: x['lead_owner'] if x['lead_owner'] in agents else x['agent_final'], axis=1)

и сделать to_list, если требуется

0 голосов
/ 30 сентября 2019

С numpy.where однострочник:

my_list = np.where(df.lead_owner.isin(df.agent_final), df.lead_owner, df.agent_final)

Простой пример:

In [284]: df
Out[284]: 
  lead_owner agent_final
0          a           1
1          b           2
2          c           a
3          e           c

In [285]: np.where(df.lead_owner.isin(df.agent_final), df.lead_owner, df.agent_final)
Out[285]: array(['a', '2', 'c', 'c'], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...