проверьте, содержит ли строка nan панд

#python #pandas #indexing #nan

Вопрос:

У меня есть df фрейм данных с 5 строками и 3 столбцами, проиндексированными по дате:

 OA_Year 0   1   2       
1968    12.0 2.0 NaN
1969    2.0 1.0 1.0
1970    8.0 4.0 2.0
1971    8.0 4.0 2.0
1972    0.0 3.0 1.0 
 

Я пытаюсь написать for цикл, который добавит записи в столбцы 0 и 1, если столбец 2 содержит значение NaN . На данный момент я оставил результат равным чему-то более простому, чтобы проверить, работает ли цикл.

 for i in range(5): 
    if df.iloc[i, 2] == np.nan: 
        result = np.nan
    else: 
        result = 'False'
    print(result)
 

Вместо того, чтобы получать список с NaN «Ложью» и «Ложью», я получаю только результат «Ложь».
Это то, что я пытаюсь получить:

 1968 NaN
1969 False
1970 False
1971 False
1972 False
 

Комментарии:

1. «это добавит записи в столбцы 0 и 1, если столбец 2 содержит значение NaN «. Вы хотите добавить записи , если есть столбец 2 nan , или вернуть nan , если есть nan ?

2. добавляйте записи, А НЕ возвращайте nan !

3. Но ваш for цикл делает обратное: if df.iloc[i, 2] == np.nan .

Ответ №1:

Я не совсем уверен, что понимаю, что вам нужно, но в целом — вам не обязательно нужен цикл for для достижения того, чего вы хотите. Например, это приведет к суммированию значений в столбцах 0 и 1, для которых столбец 2 не содержит nan .

 import pandas as pd

df = pd.DataFrame({'Year': [1990, 1991, 1992, 1993], '0': np.random.rand(4), '1': np.random.rand(4), '2': [np.nan, 1, 2, 1]})
df[~df['2'].isna()][['0','1']].sum(axis = 1)
 

Ответ №2:

Поскольку требование неясно, посмотрите, действительно ли это то, что вы хотите:

Добавьте записи в столбец 0 и 1 в столбец 2 , если столбец 2 содержит значение NaN :

Здесь мы используем .fillna() для заполнения NaN значений в столбце 2 сумму из 2 столбцов 0 и 1 :

 df['2'] = df['2'].fillna(df['0']   df['1'])
 

Или использовать:

 df['2'] = df['2'].fillna(df[['0', '1']].sum(axis=1))
 

Результат:

 print(df)

   OA_Year     0    1     2
0     1968  12.0  2.0  14.0
1     1969   2.0  1.0   1.0
2     1970   8.0  4.0   2.0
3     1971   8.0  4.0   2.0
4     1972   0.0  3.0   1.0