Есть ли способ объединить два утверждения
df.isnull().sum()
и
(df == 0).sum()
, чтобы получить следующий обзор?
Демо:
df = pd.DataFrame({'a':[1,0,0,1,3], 'b':[0,NaN,1,NaN,1], 'c':[0,0,0,0,NaN]})
df
a b c
0 1 0.0 0.0
1 0 NaN 0.0
2 0 1.0 0.0
3 1 NaN 0.0
4 3 1.0 NaN
Ожидаемый результат:
a 2
b 3
c 5
Наверное, очень просто, но я не могу найти решение ... Спасибо за вашу помощь
Вы имеете в виду именно это:
In[27]:
(df==0).sum() + df.isnull().sum()
Out[27]:
a 2
b 3
c 5
dtype: int64
РЕДАКТИРОВАТЬ
Благодаря @coldpseed за предложение вы также можете сделать следующее:
In[28]:
df[df!=0].isnull().sum()
Out[28]:
a 2
b 3
c 5
dtype: int64
что более лаконично, я всегда был сторонником ясности, но иногда побеждает более короткий код.
df[df != 0].isnull().sum()
, чтобы сделать это одним вызовом ... кстати, приятно вас видеть :)
@ cᴏʟᴅsᴘᴇᴇᴅ спасибо, это кажется более аккуратным, я должен включить? Я взял долгий перерыв в SO после того, как был немного разочарован, а также был очень занят на работе, просто опустив ногу, образно говоря, в
Да, безусловно, это было предназначено для вас! Нам нужно вернуть наших старых ветеранов, лучшего времени для вашего возвращения нет.
ох ... это именно то, что я искал. Я подозревал, что для этого запроса существует специальное выражение ржу не могу Спасибо за вашу помощь!
@ Stomar02 лучше не задумываться, здесь, используя +
, результирующая серия будет естественным образом выровнена по своим индексам, поэтому это не так сложно, как кажется
Другой вариант:
>>> ((df == 0) | df.isnull()).sum()
a 2
b 3
c 5
dtype: int64
>>>
Также:
>>> (df.eq(0) | df.isnull()).sum()
a 2
b 3
c 5
dtype: int64
>>>
С fillna
df.fillna(0).eq(0).sum()
Out[8]:
a 2
b 3
c 5
dtype: int64
Еще один изящный вариант (fillna май будет медленным на больших кадрах), но если производительность не является ключевой, это не имеет значения.
Что плохого только в
(df==0).sum() + df.isnull().sum()
?