Получение всех остальных столбцов на основе значения Pandas Dataframe - PullRequest
0 голосов
/ 08 июня 2018

Допустим, у меня есть следующее значение df:

>  Name   A     B     C     D   
   John   Nan   1     2     Nan   
   Mike   2     Nan   Nan   Nan   
   Fred   Nan   5     6     7    
   Ana    3     Nan   3     2   
   Fran   2     Nan   1     1

Что я хочу сделать, так это отсортировать некоторые столбцы так, чтобы все, у кого был заполнен только столбец A (в данном случае, Майк):

> df_1 = df[(df['A'] > 0)&(~(df['A'] == 0))]

или я хочу заполнить только два столбца (в данном случае ни одного):

df_1 = df[(df['A','B'] > 0)&(~(df['A','B'] == 0))]

Я действительно борюсь с этим.

tks

1 Ответ

0 голосов
/ 08 июня 2018

isnull + all

Ваш синтаксис неверен.Вы можете использовать pd.DataFrame.isnull:

mask1 = df['A'] > 0
mask2 = df[['B', 'C', 'D']].isnull().all(1)

df_1 = df_1[mask1 & mask2]

Аналогично, для вашего второго запроса:

mask1 = (df[['A', 'B']] > 0).all(1)
mask2 = df[['C', 'D']].isnull().all(1)

df_1 = df_1[mask1 & mask2]

Предполагается, что вы хотите явно фильтровать значения больше 0в mask1.Если достаточно любого ненулевого числа, вы можете использовать pd.DataFrame.notnull.

Не бойтесь таким образом разделить ваши маски на несколько строк.Это сделает ваш код более понятным и простым в управлении.

pipe + isnull + all

В более общем смысле вы можете написать функцию для вычисления и применения маски логического ряда:

def masker(df, cols_required):

    """ Supply list cols_required. These must be > 0; others null. """

    mask1 = (df[cols_required] > 0).all(1)
    mask2 = df[df.columns.difference(cols_required)].isnull().all(1)
    return df[mask1 & mask2]

df = df.pipe(masker, cols_required=['A', 'B'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...