Итерировать более pandas кадра данных при обновлении значений - PullRequest
1 голос
/ 02 августа 2020

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

Рассмотрим фрейм данных, который содержит список имен и времени, и известное время начала. Затем я хочу обновить фрейм данных с помощью времени fini sh, которое рассчитывается из starttime + Time

import pandas as pd
import datetime

df = pd.DataFrame({"Name": ["Kate","Sarah","Isabell","Connie","Elsa","Anne","Lin"],
                  "Time":[3, 6,1, 7, 23,3,4]})
starttime = datetime.datetime.strptime('2020-02-04 00:00:00', '%Y-%m-%d %H:%M:%S')

Я знаю, что для каждого случая я могу рассчитать время fini sh, используя

finishtime = starttine + datetime.datetime.timedelta(minutes = df.iloc[0,1])

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

Я пробовал

df["FinishTime"] = np.nan

for row in df.itertuples():
    df.at[row,"FinishTime"] = starttine + datetime.datetime.timedelta(minutes = row.Time)

, но это дало много ошибок, которые я не мог разгадать. Как я должен это сделать?

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

1 Ответ

2 голосов
/ 02 августа 2020

Используйте pd.to_timedelta()

import datetime
starttime = datetime.datetime.strptime('2020-02-04 00:00:00', '%Y-%m-%d %H:%M:%S')
df = pd.DataFrame({"Name": ["Kate","Sarah","Isabell","Connie","Elsa","Anne","Lin"],
    "Time":[3, 6,1, 7, 23,3,4]})
df.Time = pd.to_timedelta(df.Time, unit='m')
# df = df.assign(FinishTime = df.Time + starttime)
df['FinishTime'] = df.Time + starttime # as pointed out by Trenton McKinney, .assign() is only one way to create new columns
# creating with df['new_col'] has the benefit of not having to copy the full df

print(df)

Вывод

      Name     Time          FinishTime
0     Kate 00:03:00 2020-02-04 00:03:00
1    Sarah 00:06:00 2020-02-04 00:06:00
2  Isabell 00:01:00 2020-02-04 00:01:00
3   Connie 00:07:00 2020-02-04 00:07:00
4     Elsa 00:23:00 2020-02-04 00:23:00
5     Anne 00:03:00 2020-02-04 00:03:00
6      Lin 00:04:00 2020-02-04 00:04:00

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_timedelta.html

Избегайте зацикливания в pandas любой ценой

Возможно, не любой ценой, но pandas использует преимущества C реализаций для повышения производительности на несколько порядков. Для нашего удобства уже реализовано много (много) общих функций.

Вот отличный stackoverflow разговор об этом самом топе c.

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