pandas расчесывание данных - PullRequest
0 голосов
/ 14 сентября 2018

Эй, у меня есть набор данных порядка временных рядов в пандах с пропущенными значениями для некоторых дат, чтобы исправить его. Я пытаюсь подобрать значение из предыдущих доступных дат.

for date in dates_missing:
    df_temp = df[df.order_date<date].sort_values(['order_date'],ascending=False)
    supplier_map = df_temp.groupby('supplier_id')['value'].first()

    for supplier_id in supplier_map.index.values:
        df[(df.order_datetime==date)&(df.su_id == supp)]['value'] = supplier_map.get(supplier_id)

Чтобы объяснить код, который яя зацикливаюсь на пропущенных датах, затем выбираю список значений, предшествующих пропущенной дате.Затем получение идентификатора поставщика для отображения карты с использованием панд сначала ()

СЕЙЧАС самая медленная часть обновляет исходный фрейм данных

IЯ зацикливаюсь на каждом поставщике и обновляю значения в исходном фрейме данных.

Нужно предложение ускорить этот внутренний цикл

Пример:

|order_date|supplier_id |value |sku_id| |2017-12-01| 10 | 1.0 | 1 | |2017-12-01| 9 | 1.3 | 7 | |2017-12-01| 3 | 1.4 | 2 | |2017-12-02| 3 | 0 | 2 | |2017-12-02| 9 | 0 | 7 | |2017-12-03| 3 | 1.0 | 2 | |2017-12-03| 10 | 1.0 | 1 | |2017-12-03| 9 | 1.3 | 7 |

дата исправления 2017-12-02

|2017-12-02| 3 | 0 | 2 | |2017-12-02| 9 | 0 | 7 |

исправленный фрейм данных

|order_date|supplier_id |value |sku_id| |2017-12-01| 10 | 1.0 | 1 | |2017-12-01| 9 | 1.3 | 7 | |2017-12-01| 3 | 1.4 | 2 | |2017-12-02| 3 | 1.4 | 2 | |2017-12-02| 9 | 1.3 | 7 | |2017-12-03| 3 | 1.0 | 2 | |2017-12-03| 10 | 1.0 | 1 | |2017-12-03| 9 | 1.3 | 7 | PS: Я, возможно, не совсем ясно с вопросом, поэтому был бы рад ответить на сомнения и отредактировать сообщение дальше.

1 Ответ

0 голосов
/ 14 сентября 2018

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

Это может уменьшить вашивремя

df.replace(0,np.nan,inplace=True)
df['values'] = df.groupby([df.supplier_id])['values'].apply(lambda x: x.replace(0,np.nan).fillna(method='ffill').fillna(method = 'bfill'))

Out:

    order_date  sku_id  supplier_id values
0   2017-12-01  1   10  1.0
1   2017-12-01  7   9   1.3
2   2017-12-01  2   3   1.4
3   2017-12-02  2   3   1.4
4   2017-12-02  7   9   1.3
5   2017-12-03  2   3   1.0
6   2017-12-03  1   10  1.0
7   2017-12-03  7   9   1.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...