Сумма по всем NaNs в pandas возвращает ноль?
Я пытаюсь суммировать столбцы Pandas dataframe, и когда у меня есть NaNs в каждом столбце, я получаю sum = zero; Я ожидал сумму = NaN на основе документов. Вот что у меня есть:
In [136]: df = pd.DataFrame()
In [137]: df['a'] = [1,2,np.nan,3]
In [138]: df['b'] = [4,5,np.nan,6]
In [139]: df
Out[139]:
a b
0 1 4
1 2 5
2 NaN NaN
3 3 6
In [140]: df['total'] = df.sum(axis=1)
In [141]: df
Out[141]:
a b total
0 1 4 5
1 2 5 7
2 NaN NaN 0
3 3 6 9
Документы pandas.DataFrame.sum говорят: "Если вся строка/столбец NA, результат будет NA", поэтому я не понимаю, почему "total" = 0, а не NaN для индекса 2. Что я не хватает?
Ответы
Ответ 1
Отличная ссылка предоставлена Джеффом.
Здесь вы можете найти пример:
df1 = pd.DataFrame();
df1['a'] = [1,2,np.nan,3];
df1['b'] = [np.nan,2,np.nan,3]
df1
Out[4]:
a b
0 1.0 NaN
1 2.0 2.0
2 NaN NaN
3 3.0 3.0
df1.sum(axis=1, skipna=False)
Out[6]:
0 NaN
1 4.0
2 NaN
3 6.0
dtype: float64
df1.sum(axis=1, skipna=True)
Out[7]:
0 1.0
1 4.0
2 0.0
3 6.0
dtype: float64
Ответ 2
Решением было бы выбрать все случаи, когда строки все-нан, а затем установить сумму в nan:
df['total'] = df.sum(axis=1)
df.loc[df['a'].isnull() & df['b'].isnull(),'total']=np.nan
или
df['total'] = df.sum(axis=1)
df.loc[df[['a','b']].isnull().all(1),'total']=np.nan
Последний вариант, вероятно, более практичен, потому что вы можете создать список столбцов ['a','b', ... , 'z']
, который вы можете суммировать.
Ответ 3
pandas 0.24.2 документация "Справочник по API" DataFrame "pandas.DataFrame"
DataFrame.sum(self, axis=None, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs)
min_count: int, default 0
Необходимое количество допустимых значений для выполнить операцию. Если меньше чем min_count не-NA значения представить результат будет NA.
Новое в версии 0.22.0: Добавлено по умолчанию 0. Это означает, что сумма всех NA или пустой серии равна 0, а произведение всех NA или пустая серия - 1.
Цитируя последние документы панд, он говорит, что min_count
будет 0 для серии все-NA
Если вы скажете min_count=1
, то результатом суммы будет nan
Ответ 4
Я справился с этим, приведя ряд к массиву, который правильно вычисляет ответ.
print(np.array([np.nan,np.nan,np.nan]).sum()) # nan
print(pd.Series([np.nan,np.nan,np.nan]).sum()) # 0.0
print(pd.Series([np.nan,np.nan,np.nan]).to_numpy().sum()) # nan
Ответ 5
data.isnull(). сумма()
данные: это фрейм данных
вывод: будет в формате ниже
БРЕНД 928
ДОГОВОР № 0
ID КЛИЕНТА 0
Имя заемщика 0
ЗАЕМНЫЙ АДРЕС 2
ЗАЯВКА ЭЛЕКТРОННАЯ ПОЧТА 130
d={};
for col in data_rnr.columns:
#print(data_rnr[col].name)
#if data_rnr[data_rnr[col].any() == 0]:
d[data_rnr[col].name]=sum(data_rnr[col]== 0)
# print('hello')
#print(sum(data_rnr[col]== 0))