заменить атрибут нулевыми значениями на среднее количество элементов с похожими атрибутами - PullRequest
0 голосов
/ 24 октября 2018

У меня есть некоторые данные о высоте зондов в некоторых бассейнах.Нулевые значения высоты являются ложными, и я хочу заменить их средними значениями высоты зондов в том же бассейне.

import pandas as pd

index = [0,1,2,3,4,5]
s = pd.Series([0,2,2,0,1,6],index= index)  #height values
t = pd.Series(['A','A','A','B','B','B'],index= index)  #basins' names
df = pd.concat([s,t], axis=1, keys=['Height','Basin'])
print(df)

   Height Basin
0       0     A
1       2     A
2       2     A
3       0     B
4       1     B
5       6     B

Я начну с создания DataFrame, который хранит средние высоты в бассейне:

#find height avergage in same basin
bound_df = df[df['Height']>0]
mean_height_df = bound_df.groupby(['Basin'])['Height'].mean()
print(mean_height_df)

Basin
A    2.0
B    3.5

И я пытаюсь заменить нулевые значения средними значениями соответствующего бассейна:

#substitute zeros w/ the average value
df.loc[df['Height']<=0, 'Height'] = mean_height_df.loc[mean_height_df['Basin'],'Height']

Но это выдает ошибку, которую я не понимаю:

Файл "pandas / _libs / hashtable_class_helper.pxi", строка 1218, в pandas._libs.hashtable.PyObjectHashTable.get_item

KeyError: 'Basin'

Чтоэто значит?Это проблема нарезки?

Есть ли альтернативный подход?

1 Ответ

0 голосов
/ 24 октября 2018

Я думаю, вы думаете об этом.Попробуйте использовать fillna, значения заполняются на основе индекса.Вам понадобится немного настроек, и тогда вы сможете использовать mean_height_df как обычно.

# Set "Basin" as the index.
v = df.set_index('Basin')['Height']  
# Mask values that <= 0 and fill NaNs by the computed mean. 
df['Height'] = v.mask(v.le(0)).fillna(mean_height_df).values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...