Заполнение нулевых значений для групп строк

#python #pandas

#python #панды

Вопрос:

У меня есть фрейм данных, который выглядит как:

 id   key   value
1    foo   1
2    bar   NaN
3    foo   NaN
4    bar   3
5    bar   NaN
6    foo   1
 

Каждому соответствует только одно ненулевое value key значение . Например, foo равно либо 1, либо NaN . Bar равен либо 3, либо NaN.

Мне нужно заполнить value для каждого key на основе этих ненулевых значений. Желаемый результат должен выглядеть так:

 id   key   value
1    foo   1
2    bar   3
3    foo   1
4    bar   3
5    bar   3
6    foo   1
 

Я знаю, как это сделать, используя цикл for, но этот фрейм данных содержит миллионы строк, и его перебор займет очень много времени. fillna() Я использовал только для простого использования, и я не уверен, как это будет применяться здесь, или если это должно быть.

Любая помощь приветствуется.

Ответ №1:

Вы можете использовать groupby().transform с first :

 df['value'] = df.groupby('key')['value'].transform('first')
 

Вывод:

    id  key  value
0   1  foo    1.0
1   2  bar    3.0
2   3  foo    1.0
3   4  bar    3.0
4   5  bar    3.0
5   6  foo    1.0
 

Ответ №2:

Давайте попробуем ffill с bfill

 df['value'] = df.groupby('key').value.apply(lambda x : x.ffill().bfill())
df
Out[85]: 
   id  key  value
0   1  foo    1.0
1   2  bar    3.0
2   3  foo    1.0
3   4  bar    3.0
4   5  bar    3.0
5   6  foo    1.0
 

Ответ №3:

Этот скрипт поможет вам

 import pandas as pd
from numpy import nan
from sklearn.impute import SimpleImputer

data = {
  "id":    [1, 2, 3, 4, 5, 6],
  "key":   ["foo", "bar", "foo", "bar", "foo", "bar"],
  "value": [1, nan, nan, 3, nan, 1]
}

data          = pd.DataFrame(data)
imputer       = SimpleImputer(missing_values=nan, strategy='mean')
data['value'] = imputer.fit_transform(data[['value']])

print(data) 
 

вывод

    id  key     value
0   1  foo  1.000000
1   2  bar  1.666667
2   3  foo  1.666667
3   4  bar  3.000000
4   5  foo  1.666667
5   6  bar  1.000000
 

Я использую SimpleImputer с mean помощью sterategy и заполняю значения NaN