Усреднение по одному столбцу, имеющему NaNs

#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. Эй, спасибо за обновление, я дам вам знать, как только закончу собирать свой набор данных. Надеюсь, к завтрашнему дню.