Я хотел бы изменить функцию, которая принимает единственное значение в столбце Индикатора, чтобы заполнить (0) столбцом Значения сложенного информационного кадра для работы с списком индикаторов для которых значения Nan должны быть установлены на ноль.
import pandas as pd
import numpy as np
df = pd.DataFrame({'ISO3': ['Australia', 'Austria', 'Belgium', 'Canada', 'Australia', 'Austria', 'Belgium', 'Canada'],
'Year': [1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991],
'Indicator' : ['Disaster Fatalities', 'Disaster Fatalities', 'Disaster Fatalities', 'Disaster Fatalities', 'Oil Reserves', 'Oil Reserves', 'Oil Reserves', 'Oil Reserves' ],
'Value' : [np.nan, 5, np.nan, 18, np.nan, np.nan, np.nan, np.nan]
})
df.head(8)
Дает:
ISO3 Year Indicator Value
0 Australia 1991 Disaster Fatalities NaN
1 Austria 1991 Disaster Fatalities 5.0
2 Belgium 1991 Disaster Fatalities NaN
3 Canada 1991 Disaster Fatalities 18.0
4 Australia 1991 Oil Reserves NaN
5 Austria 1991 Oil Reserves NaN
6 Belgium 1991 Oil Reserves NaN
7 Canada 1991 Oil Reserves NaN
Функция для установки значений Nan на ноль для одного индикатора:
def zerofillnaindicator (df, Indicators):
mask = (df['Indicator'] == Indicators)
df.loc[mask, 'Value'] = df.loc[mask, 'Value'].fillna(0)
return df
Вызывается с
df2 = zerofillnaindicator (df = df, Indicators = 'Disaster Fatalities')
df2.head(8)
Дает по желанию:
ISO3 Year Indicator Value
0 Australia 1991 Disaster Fatalities 0.0
1 Austria 1991 Disaster Fatalities 5.0
2 Belgium 1991 Disaster Fatalities 0.0
3 Canada 1991 Disaster Fatalities 18.0
4 Australia 1991 Oil Reserves NaN
5 Austria 1991 Oil Reserves NaN
6 Belgium 1991 Oil Reserves NaN
7 Canada 1991 Oil Reserves NaN
Но как мне изменить это, чтобы получить список индикаторов, подобный этому:
df2 = zerofillnaindicator (df = df, Indicators = ['Disaster Fatalities', 'Oil Reserves'])
df2.head(8)
Я пыталсязамена условия для маски на df.isin (Indicators) , но это привело к ошибке «Не удается индексировать с многомерным ключом» в функции .isin
def zerofillnaindicator (df, Indicators):
mask = df.isin(Indicators)
df.loc[mask, 'Value'] = df.loc[mask, 'Value'].fillna(0)
return df