Сумма по всем 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))