Pandas Маска запроса - PullRequest
       0

Pandas Маска запроса

1 голос
/ 29 мая 2020

У меня есть запрос в масках - Мой X определяется следующим образом

X = pd.DataFrame({'a':[1,250,480],
               'b':[60,51,101],
               'c':[15,689,1],
               'd':[1,1,1],
               'e':[2,2,2]})

, что дает мой X, как показано ниже

    a   b   c   d   e
0   1   60  15  1   2
1   250 51  689 1   2
2   480 101 1   1   2

Когда я создаю маску как x['d'] =x.mask(x['c'] >100, "b")

Я получаю следующий результат ..

    a   b   c   d   e
0   1   60  15  1   2
1   250 51  689 b   2
2   480 101 1   480 2

Я не понимаю, откуда берется 480 в столбце d.

В частности, x ['d'] now [1 b 480] b ясно, но откуда 480 ?? Думаю, мне что-то не хватает о том, как работают маски.

Спасибо.

1 Ответ

1 голос
/ 29 мая 2020

Похоже, что это задумано, если назначить DataFrame одному столбцу, он назначит первый столбец DataFrame.


Он использует первый столбец, как если бы не указанные столбцы - здесь используется DataFrame.mask, потому что x передается в mask (не указано имя столбца после x):

#replaced to `b` value all columns in df by mask x['c'] >100       
print (x.mask(x['c'] >100, "b"))
      ^^^ 
     a    b   c  d  e
0    1   60  15  1  2
1    b    b   b  b  b
2  480  101   1  1  2

И если назначить некоторому столбцу, используется первый столбец:

x['d'] = x.mask(x['c'] >100, "b")
        ^^^ 
print (x)
     a    b    c    d  e
0    1   60   15    1  2
1  250   51  689    b  2
2  480  101    1  480  2

Тест с удаленным первым столбцом a, затем назначается первый столбец, здесь b:

x = pd.DataFrame({ 'b':[60,51,101],
               'c':[15,689,1],
               'd':[1,1,1],
               'e':[2,2,2]})

print (x.mask(x['c'] >100, "b"))
      ^^^ 
     b   c  d  e
0   60  15  1  2
1    b   b  b  b
2  101   1  1  2

x['d'] = x.mask(x['c'] >100, "b")
        ^^^ 
print (x)
     b    c    d  e
0   60   15   60  2
1   51  689    b  2
2  101    1  101  2

Если назначить DataFrame столбцу без условия, то же самое поведение:

x['d'] = x
        ^^^ 
print (x)
     a    b    c    d  e
0    1   60   15    1  2
1  250   51  689  250  2
2  480  101    1  480  2

Если вы хотите назначить 2 столбца, он правильно вызывает ошибку:

x[['d','e']] = x.mask(x['c'] >100, "b")
              ^^^ 
print (x)

ValueError: столбцы должны быть той же длины, что и ключ

Правильный способ с указанным столбцом с Series.mask - Series, (столбец) назначается, потому что указанное имя столбца после x передается Series, здесь x['d'], x['b']:

#replaced to `b` value only column `d` in df by mask x['c'] >100  
print (x['d'].mask(x['c'] >100, "b"))
        ^^^ 
0    1
1    b
2    1
Name: d, dtype: object

#replaced to `b` value only column `b` in df by mask x['c'] >100  
print (x['b'].mask(x['c'] >100, "b"))
         ^^^ 
0     60
1      b
2    101
Name: b, dtype: object


x['d'] = x['d'].mask(x['c'] >100, "b")
           ^^^ 
x['e'] = x['b'].mask(x['c'] >100, "b")
           ^^^ 
print (x)
     a    b    c  d    e
0    1   60   15  1   60
1  250   51  689  b    b
2  480  101    1  1  101
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...