Панды заполняют значения наночастиц разделением первого доступного значения - PullRequest
3 голосов
/ 25 июня 2019

Я пытаюсь заменить значения nan в DataFrame разделением первого предыдущего доступного значения на все следующие значения nan.

В приведенном ниже примере:

import pandas as pd
df = [100, None, None, 40, None, 120]
df = pd.DataFrame(df)

Хотелось бы получить:

[33.33, 33.33, 33.33, 20, 20, 120]

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

Ответы [ 2 ]

5 голосов
/ 25 июня 2019

Использование:

import pandas as pd
df = [100, None, None, 40, None, 120]
df = pd.DataFrame(df, columns=['a'])

s = df['a'].ffill() / df.groupby(df['a'].notna().cumsum())['a'].transform('size')
print (s)

0     33.333333
1     33.333333
2     33.333333
3     20.000000
4     20.000000
5    120.000000
Name: a, dtype: float64

Подробности :

Вы можете заменить отсутствующее значение предыдущими значениями, отличными от NaN s, на ffill:

print (df['a'].ffill())
0    100.0
1    100.0
2    100.0
3     40.0
4     40.0
5    120.0
Name: a, dtype: float64

Затем сравните по Series.notna и создайте группы по Series.cumsum:

print (df['a'].notna().cumsum())
0    1
1    1
2    1
3    2
4    2
5    3
Name: a, dtype: int32

И получите количество для групп с таким же размером, как у оригиналас GroupBy.transform:

print (df.groupby(df['a'].notna().cumsum())['a'].transform('size'))
0    3
1    3
2    3
3    2
4    2
5    1
Name: a, dtype: int64
0 голосов
/ 25 июня 2019

Может быть, использовать ffill, получить первый столбец и разделить его на него (ffill ed dataframe) groupby ed и использовать transform('count'), чтобы получить счетчики и сохранить ту же длину для dataframe:

print(df.ffill()[0] / df.ffill().groupby(0)[0].transform('count'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...