Эффективный способ нарезать струны в пандах - PullRequest
4 голосов
/ 24 октября 2019

У меня есть набор данных, который содержит более 100 миллионов строк, которыми я пытаюсь манипулировать в пандах. Я пытаюсь нарезать строку в a на основе значений в b и c в качестве начальной и конечной точек соответственно.

enter image description here

Я могу сделать это с помощью понимания списка следующим образом:

df['d'] = [a[1]['a'][a[1]['b']:a[1]['c']] for a in df.iterrows()]

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

df['d'] = df.apply(lambda x: x['a'][x['b']:x['c']],axis=1)

Это также довольно медленно. Мой вопрос: каков наиболее эффективный способ нарезать строки в a, используя значения в b и c в качестве начала и конца для среза?

1 Ответ

3 голосов
/ 24 октября 2019

Итерация по df.iterrows() действительно медленная, потому что для каждой строки создается отдельный объект pd.Series. Для 100 миллионов строк это означает, что 100 миллионов таких объектов создаются (и удаляются). Лучше zip столбцы и использовать это в понимании следующим образом:

df.assign(d=[a[b:c] for a, b, c in zip(df['a'], df['b'], df['c'])])

Это создаст только три Series объекта и затем итерирует по ним, что экономит много накладных расходов.

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

...