Векторизованный способ применения функции к информационному фрейму для создания списков - PullRequest
0 голосов
/ 29 ноября 2018

Я видел несколько таких вопросов

Векторизованная альтернатива iterrows , Более быстрая альтернатива iterrows , Pandas: Альтернатива циклам iterrow , для цикла с использованием iterrows в пандах , python: использование .iterrows () для создания столбцов , Производительность Iterrows .Но, похоже, что каждый - это уникальный случай, а не обобщенный подход.

Мои вопросы также снова о .iterrows.

Я пытаюсь передать первую и вторую строку функции и создать из нее список.

Что у меня есть:

Iу меня есть pandas DataFrame с двумя столбцами, которые выглядят следующим образом.

         I.D         Score
1         11          26
3         12          26
5         13          26
6         14          25

Что я сделал:

, где термин Point - это функция, которую я определил ранее.

my_points = [Points(int(row[0]),row[1]) for index, row in score.iterrows()]

Что я пытаюсь сделать:

Более быстрая и векторизованная форма вышеупомянутого.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Попробуйте понимание списка:

score = pd.concat([score] * 1000, ignore_index=True)

def Points(a,b):
    return (a,b)

In [147]: %timeit [Points(int(a),b) for a, b in zip(score['I.D'],score['Score'])]
1.3 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [148]: %timeit [Points(int(row[0]),row[1]) for index, row in score.iterrows()]
259 ms ± 5.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [149]: %timeit [Points(int(row[0]),row[1]) for row in score.itertuples()]
3.64 ms ± 80.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0 голосов
/ 29 ноября 2018

Вы когда-нибудь пробовали метод .itertuples()?

my_points = [Points(int(row[0]),row[1]) for row in score.itertuples()]

Это более быстрый способ перебора кадра данных pandas.

Надеюсь, это поможет.

0 голосов
/ 29 ноября 2018

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

Вы можете использовать pandas.DataFrame.apply с axis, установленным на 1:

df.apply(func, axis=1)

Чтобы поместить в список, это зависит от того, что возвращает ваша функция, но вы можете:

df.apply(Points, axis=1).tolist()

Если вы хотите подать заявку только на некоторые столбцы:

df[['Score', 'I.D']].apply(Points, axis=1)

Если вы хотите подать заявку на func, который занимает несколько args, используйте numpy.vectorize для скорости:

np.vectorize(Points)(df['Score'], df['I.D'])

или lambda:

df.apply(lambda x: Points(x['Score'], x['I.D']), axis=1).tolist()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...