Size: a a a

Python для анализа данных

2019 March 21

o

olapotnikov in Python для анализа данных
Спасибо всем еще раз, буду пробовать
источник
2019 March 22

AK

Alex Koletvin in Python для анализа данных
Добрый день, подскажите как  можно заполнить отсутсвующие (или нулевые)  значение в столбце в датафрейме предыдущим значением, но при условие, что id предыдущей строки совпадает с id текущей строки (иначе заполнить нулём).
Грубо говоря нужно что то типо .fillna(method='ffill') , но с условием на id
источник

AK

Alex Koletvin in Python для анализа данных
Пока есть идея пробежаться циклом по всем id и применять к кусочкам датафрейма fillna, есть оптимальнее способы?
источник

АМ

Алексей Макаров... in Python для анализа данных
А id строки - это index имеется в виду? Или у вас есть отдельная колонка id?
источник

R

Roman in Python для анализа данных
Alex Koletvin
Добрый день, подскажите как  можно заполнить отсутсвующие (или нулевые)  значение в столбце в датафрейме предыдущим значением, но при условие, что id предыдущей строки совпадает с id текущей строки (иначе заполнить нулём).
Грубо говоря нужно что то типо .fillna(method='ffill') , но с условием на id
Я бы циклом через .loc делал
источник

AB

Anastasia Belokon in Python для анализа данных
Alex Koletvin
Добрый день, подскажите как  можно заполнить отсутсвующие (или нулевые)  значение в столбце в датафрейме предыдущим значением, но при условие, что id предыдущей строки совпадает с id текущей строки (иначе заполнить нулём).
Грубо говоря нужно что то типо .fillna(method='ffill') , но с условием на id
Добрый день! Вы можете сделать ffill по всему датафрейму, а затем заполнить значения при несовпадающих id нулем. Вот таким способом:  df.loc[df['id'].shift()!=df['id']] = 0 (это если id отдельная колонка)
источник

АМ

Алексей Макаров... in Python для анализа данных
А ещё можно попробовать что-то вот такое сделать df.groupby(['id'], as_index=False).apply(lambda group: group.ffill())
источник

AK

Alex Koletvin in Python для анализа данных
Алексей Макаров
А id строки - это index имеется в виду? Или у вас есть отдельная колонка id?
вообще отдельная колонка, но можно сделать индексом, не принципиально
источник

AK

Alex Koletvin in Python для анализа данных
Anastasia Belokon
Добрый день! Вы можете сделать ffill по всему датафрейму, а затем заполнить значения при несовпадающих id нулем. Вот таким способом:  df.loc[df['id'].shift()!=df['id']] = 0 (это если id отдельная колонка)
В этом слчае насколько я понимаю устранится проблема с первым значением, но ffill может "загадить" сотни значений с другим айди
источник

AK

Alex Koletvin in Python для анализа данных
Алексей Макаров
А ещё можно попробовать что-то вот такое сделать df.groupby(['id'], as_index=False).apply(lambda group: group.ffill())
Попробую спасибо
источник

AK

Alex Koletvin in Python для анализа данных
Roman
Я бы циклом через .loc делал
Тоже сразу про это подумал, посмотрю на производительность предыдущего метода, возможно самый простой вариант с циклом вполне неплох
источник

AK

Alex Koletvin in Python для анализа данных
Еще вопрос - как можно сгрппировать таблицу такого вида таким образом, что если в столбце 'poor' идет несколько значение True (или False) подряд, то эти строки аггрегировались и добавлялся столбец с протяженностью периода (то есть максимально utc_time минус минимальное).
При этом groupby['generated_id','realpurchase_count', 'poor'] не подходит, так как нужно группировать именно по идущим подряд непрерывающимся отрезкам True или False.
Писать ли функцию для этого или в чудесном пандасе можно реализовать такую задачу проще?
источник

АМ

Алексей Макаров... in Python для анализа данных
Я бы сделал отдельную колонку, в которой считался бы номер подряд идущего блока True или False, а потом уже групбай с этой колонкой
источник

АМ

Алексей Макаров... in Python для анализа данных
Можно сделать колонку df['poor'] != df['poor'].shift(1). Она будет принимать значение 0, если значение poor совпадает, и 1 если значение не совпадает
источник

АМ

Алексей Макаров... in Python для анализа данных
А потом нужно сделать новую колонку с cumsum по предыдущей колонке
источник

АМ

Алексей Макаров... in Python для анализа данных
Тогда значения 1 накопительно просуммируются и мы получим некий идентификатор блока
источник

AK

Alex Koletvin in Python для анализа данных
Понял,  спасибо  за помощь
источник

АМ

Алексей Макаров... in Python для анализа данных
Хотя, тут же еще для юзера нужно делать разделение. Тогда df.groupby(['user'])['poor'].shift(1)
источник

АМ

Алексей Макаров... in Python для анализа данных
Блин, что-то не всё так просто как мне казалось)
источник

AK

Alex Koletvin in Python для анализа данных
Да, работает, раньше шифтом вообще не пользовался, мощная тема, возьму на вооружение)
источник