@DSM'nin doğru cevabı IMO'ya sahip, ancak genellememi ve sorunun optimizasyonunu paylaşmak istiyorum: Gruplandırmaya göre ve birden çok değer sütununa sahip birden çok sütun:
df = pd.DataFrame(
{
'category': ['X', 'X', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y'],
'name': ['A','A', 'B','B','B','B', 'C','C','C'],
'other_value': [10, np.nan, np.nan, 20, 30, 10, 30, np.nan, 30],
'value': [1, np.nan, np.nan, 2, 3, 1, 3, np.nan, 3],
}
)
... verir ...
category name other_value value
0 X A 10.0 1.0
1 X A NaN NaN
2 X B NaN NaN
3 X B 20.0 2.0
4 X B 30.0 3.0
5 X B 10.0 1.0
6 Y C 30.0 3.0
7 Y C NaN NaN
8 Y C 30.0 3.0
Bu genelleştirilmiş durumda biz göre gruplandırmak istiyoruz category
ve name
ve sadece üzerinde impute value
.
Bu şu şekilde çözülebilir:
df['value'] = df.groupby(['category', 'name'])['value']\
.transform(lambda x: x.fillna(x.mean()))
Group-by cümlesindeki sütun listesine ve group-by ifadesinden value
hemen sonraki sütunu seçtiğimize dikkat edin . Bu, dönüşümün yalnızca belirli bir sütunda çalıştırılmasını sağlar. Sonuna ekleyebilirsiniz, ancak daha sonra tüm sütunlar için çalıştıracaksınız ve sonunda bir ölçü sütunu hariç hepsini atacaksınız. Standart bir SQL sorgu planlayıcısı bunu optimize edebilirdi, ancak pandalar (0.19.2) bunu yapmıyor gibi görünüyor.
Yaparak veri setini artırarak performans testi ...
big_df = None
for _ in range(10000):
if big_df is None:
big_df = df.copy()
else:
big_df = pd.concat([big_df, df])
df = big_df
... bunun kaç tane sütun eklemeniz gerekmediğiyle orantılı olarak hızı artırdığını doğrular:
import pandas as pd
from datetime import datetime
def generate_data():
...
t = datetime.now()
df = generate_data()
df['value'] = df.groupby(['category', 'name'])['value']\
.transform(lambda x: x.fillna(x.mean()))
print(datetime.now()-t)
t = datetime.now()
df = generate_data()
df["value"] = df.groupby(['category', 'name'])\
.transform(lambda x: x.fillna(x.mean()))['value']
print(datetime.now()-t)
Son bir not olarak, birden fazla sütunu empoze etmek istiyorsanız, ancak hepsini değil, daha da genelleştirebilirsiniz:
df[['value', 'other_value']] = df.groupby(['category', 'name'])['value', 'other_value']\
.transform(lambda x: x.fillna(x.mean()))
groupby
bölümde ele alınmıştır . Hatırlanması gereken çok şey var, ancak "dönüşüm, orijinal çerçeve gibi dizine alınmasını istediğiniz grup başına işlemler içindir" ve benzeri kurallar alırsınız.