#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
«. Вы хотите добавить записи , если есть столбец 2nan
, или вернуть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