#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