Подсчитайте, сколько пропущенных строк в кадре данных панд по индексу пользователя - PullRequest
0 голосов
/ 05 июля 2018
user   cat  val1  val2  val3
user1  cat1   3    NA     NA
       cat2   NA   NA     NA
       cat3   NA   NA     5
user2  cat1   NA   NA     NA
       cat2   NA   6      NA
       cat3   NA   NA     7
user3  cat1   4    NA     NA
       cat2   NA   NA     NA
       cat3   NA   NA     NA

В этом кадре данных df, user и cat - индексы. Я хочу выполнить итерацию по каждому пользователю и посчитать, сколько строк на каждого пользователя имеют ВСЕ значения NA. (cat1 соответствует val1 и т. д.)

В этом примере user1 и user2 имеют 1 пропущенную строку, а user3 имеет 2 пропущенных строки.

РЕДАКТИРОВАТЬ: ответ был предоставлен значительно ниже.

Каков наилучший способ фильтрации df, чтобы отображались только пользователи без пропущенных значений.

У меня есть:

s[s == 0].index

, который обеспечивает индексы (ниже это; выше датафрейм был просто общий df)

Index([25c90900-cd25-4f51-8634-3eba9821e167,
   29b63a9d-3a60-4d69-b507-145977b0dc49,
   843a997d-5446-41d1-8697-4ded33bba85d,
   690d0511-232c-4bd9-98ae-c9bb101bc18b,
   35a2dabb-ac20-48cb-8d1e-adf53c68d546,
   859591fd-67fc-41b3-823b-33053dbccc47,
   7b8a4cfb-3010-4bc3-9963-14f2b4f6ffdb,
   266f5f1f-0a58-49ca-9e66-7e8d2058a836,
   77b99c57-f37b-48d5-b8b9-68929f31d3fc,
   47afb3d3-98bb-4486-8935-a0b57a2de0c6,
   ...
   e14e69f6-3e33-4d1f-beff-76a35c2e11e9,
   e81c9737-e632-460a-9a12-c6bc7b48341b,
   c63ddb6e-2d89-4188-97c0-794aab70a816,
   4c4a259c-7121-41c7-8e15-f8b87071489a,
   a612b6ee-4143-44a6-9214-81e607d4c9c3,
   9d95839e-94c6-4659-ab88-95159e3a1238,
   04826220-c5eb-4042-a355-217526aed323,
   6054dd2d-9298-49b9-8617-3e156459ab2d,
   3d8aeb80-7473-4d4c-90e6-8603133a7c65,
   0aa7ac36-0274-48ba-86e6-f807645e0559],
  dtype='object', name='uuid', length=2217)

1 Ответ

0 голосов
/ 05 июля 2018

Использование:

s = df.isnull().all(axis=1).sum(level=0)
print (s)
user
user1    1.0
user2    1.0
user3    2.0
dtype: float64

При необходимости DataFrame:

df1 = df.isnull().all(axis=1).sum(level=0).astype(int).reset_index(name='count')
print (df1)
    user  count
0  user1      1
1  user2      1
2  user3      2

Объяснение

Первая проверка NaN s значений во всех столбцах:

print (df.isnull())
             val1   val2   val3
user  cat                      
user1 cat1  False   True   True
      cat2   True   True   True
      cat3   True   True  False
user2 cat1   True   True   True
      cat2   True  False   True
      cat3   True   True  False
user3 cat1  False   True   True
      cat2   True   True   True
      cat3   True   True   True

Затем проверьте все строки для всех True с DataFrame.all:

print (df.isnull().all(axis=1))
user   cat 
user1  cat1    False
       cat2     True
       cat3    False
user2  cat1     True
       cat2    False
       cat3    False
user3  cat1    False
       cat2     True
       cat3     True
dtype: bool

А затем sum логическое True с, например 1 с sum:

print (df.isnull().all(axis=1).sum(level=0))
user
user1    1.0
user2    1.0
user3    2.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...