#python #pandas
Вопрос:
У меня есть набор данных, в котором в одном столбце много NAN, а все остальные нормальные.
Как я могу сгруппировать и усреднить по столбцу, в котором есть NaNs?
Пожалуйста, обратите внимание, что значения в первом столбце повторяются, поэтому я не могу просто использовать ffill и groupby, потому что это исказит мой набор данных. Одно значение может встречаться более одного раза.
column_1 column_2 column_3
0 45.0 3 2
1 NaN 4 6
2 NaN 7 2
3 37.0 1 1
4 NaN 6 4
5 NaN 2 7
6 NaN 4 5
7 45.0 2 2
8 NaN 1 1
9 NaN 3 3
Для:
column_1 column_2 column_3
0 45 4.6 3.33
1 37 3.25 4.25
2 45 2 2
Комментарии:
1. вы можете использовать
ffill
для пересылки заполнения столбца 1, а затем использовать groupby, как обычно. проверьте мой ответ для получения более подробной информации.2. Спасибо, что добавили эту деталь. Можете ли вы также добавить его в пример набора данных?, вместе с ожидаемым результатом
3. Обновил свой ответ на основе вашего обновленного вопроса. дайте мне знать, если это решит проблему
Ответ №1:
ИЗМЕНИТЬ: Основываясь на вашем обновленном вопросе, вы можете использовать shift()
группу на основе для решения этой группы. Обратите внимание, что вам все равно нужно ffill()
будет заполнить значения NA, как и раньше.
df['column_1'] = df['column_1'].ffill()
df.groupby((df['column_1']!=df['column_1'].shift()).cumsum()).mean().reset_index(drop=True)
column_1 column_2 column_3
0 45.0 4.666667 3.333333
1 37.0 3.250000 4.250000
2 45.0 2.000000 2.000000
Объяснение:
Условие группировки в основном сравнивает сдвинутый столбец с его предыдущими значениями, а затем использует cumsum()
его для суммирования, чтобы создавать новые группы при каждом изменении значения в последовательности в столбце 1.
list((df['column_1']!=df['column_1'].shift()).cumsum())
[1, 1, 1, 2, 2, 2, 2, 3, 3, 3]
Таким образом, группировка происходит в этой «скрытой» колонке.
Комментарии:
1. У меня есть повторяющиеся значения в столбце 1, такой подход сильно сбил бы мой набор данных.
2. Эй, спасибо за обновление, я дам вам знать, как только закончу собирать свой набор данных. Надеюсь, к завтрашнему дню.