Fillna on slice, который находится в другом фрейме - PullRequest
1 голос
/ 09 мая 2019

Я хотел бы изменить функцию, которая принимает единственное значение в столбце Индикатора, чтобы заполнить (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

1 Ответ

1 голос
/ 09 мая 2019

Если необходимо работать со скаляром или со списком в той же функции, используйте isinstance для преобразования скаляра в один список элементов:

def zerofillnaindicator (df, Indicators):
    vals = [Indicators] if isinstance(Indicators, str) else Indicators

    mask = df['Indicator'].isin(vals)
    df.loc[mask, 'Value'] = df.loc[mask, 'Value'].fillna(0)
    return df

df2 = zerofillnaindicator (df = df, Indicators = 'Disaster Fatalities')
print (df2)
        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

df3 = zerofillnaindicator (df = df, Indicators = ['Disaster Fatalities', 'Oil Reserves'])
print (df3)
        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    0.0
5    Austria  1991         Oil Reserves    0.0
6    Belgium  1991         Oil Reserves    0.0
7     Canada  1991         Oil Reserves    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...