найти строки, которые имеют значения только в определенных столбцах - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть такой фрейм данных:

>>> o1.columns

Индекс ([1, 2, 3, 4, 5, 6, «m1», «m2», 7, «m3», 8, 'm4', 9], dtype = 'object')

Я хочу найти строки, в которых есть только данные и только в m1, m2, m3 и m4, но остальные столбцы имеют значения Nan или пустые.,Является ли это возможным?Я пытался более или менее, как показано ниже:

>>> o11=o1[(1==@nan) && (2==@nan) && (3==@nan) && (4==@nan) && (5==@nan) && (6==@nan) && (7==@nan) && (8==@nan) && (9==@nan) && (o1.m1!=@nan) && (o1.m2!=@nan) && (o1.m3!=@nan) && (o1.m4!=@nan)]

Но это не работает.Пробовал "pd.query также".Может быть, мне не хватает очень простой вещи.Спасибо за вашу помощь.С наилучшими пожеланиями Zillur

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

С учетом кадра данных df:

df = 
         1    2    3    4    5    6    7    8    9   m1   m2    m3   m4
    0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    3  NaN    4  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.5  1.7  1.23  1.6
    4  NaN    1  NaN  NaN    1  NaN  NaN  NaN   12  NaN  NaN   NaN  NaN
    5  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    6  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN    1  1.2   1.2  1.5
    7  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN

Мы хотим, чтобы возвращалась только строка с индексом = 6 (согласно вашему требованию):

m1 = df[[1,2,3,4,5,6,7,8,9]].isna().sum(axis = 1) == 9

m2 = df[['m1', 'm2', 'm3', 'm4']].isna().sum(axis = 1) == 0

df[m1 & m2]

Вывод:

     1    2    3    4    5    6    7    8    9 m1   m2   m3   m4
6  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1  1.2  1.2  1.5
0 голосов
/ 11 сентября 2018

Позвоните notna / isna и any / all вдоль первой оси, И масок и индекса.

cols = ['m1', 'm2', 'm3', 'm4']
diff = df.columns.difference(cols).tolist()

df[df[cols].notna().any(1) & df[diff].isna().all(1)]

Предполагается, что вы хотите, чтобы ВСЕ данные в m* не были нулевыми, и наоборот.

...