Как сделать два NaN как NaN после операции вместо того, чтобы сделать его нулевым?

#pandas

#pandas

Вопрос:

У меня есть следующий фрейм данных

 import pandas as pd
import numpy as np
d = {
    'ID':[1,2,3],
    'W1':[5,6,7],
    'W2':[9, np.nan,10],
    'w3':[11,np.nan,np.nan]
}
df = pd.DataFrame(data = d)
df


  ID    W1  W2   w3
0   1   5   9.0    11.0
1   2   6   NaN     NaN
2   3   7   10.0    NaN
  

Я выполняю следующие операции

 df['Sum1'] = (df[['W1','W2']]).sum(axis = 1)/2
df['Sum2'] = (df[['W2','w3']]).sum(axis = 1)/2


    ID  W1  W2      w3  Sum1    Sum2
0   1   5   9.0    11.0 7.0     10.0
1   2   6   NaN     NaN 3.0     0.0
2   3   7   10.0    NaN 8.5     5.0
  

Как сделать Sum 2 идентификатора «2» как NaN вместо 0 после выполнения вышеуказанных операций??

Ответ №1:

Добавить параметр min_count=1 в DataFrame.sum :

min_count : int, по умолчанию 0
Необходимое количество допустимых значений для выполнения операции. Если присутствует меньше значений min_count, отличных от NA, результат будет NA.

Новое в версии 0.22.0: добавлено значение по умолчанию 0. Это означает, что сумма всех NA или пустых рядов равна 0, а произведение всех NA или пустых рядов равно 1.

 df['Sum1'] = (df[['W1','W2']]).sum(axis = 1, min_count=1)/2
df['Sum2'] = (df[['W2','w3']]).sum(axis = 1, min_count=1)/2

print (df)
   ID  W1    W2    w3  Sum1  Sum2
0   1   5   9.0  11.0   7.0  10.0
1   2   6   NaN   NaN   3.0   NaN
2   3   7  10.0   NaN   8.5   5.0
  

Но, кажется, вам нужно mean s — тогда это работает как нужно:

 df['Sum1'] = (df[['W1','W2']]).mean(axis = 1)
df['Sum2'] = (df[['W2','w3']]).mean(axis = 1)

print (df)
   ID  W1    W2    w3  Sum1  Sum2
0   1   5   9.0  11.0   7.0  10.0
1   2   6   NaN   NaN   6.0   NaN
2   3   7  10.0   NaN   8.5  10.0
  

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

1. первый ответ работает для меня! Что означает min_count=1? Когда-нибудь у меня может быть три или четыре столбца, будет ли ответ работать для этого?

2. @panda — Я думаю, да, если несколько столбцов заполнены только NaNs по строкам, это работает так же.