Похоже, что это задумано, если назначить 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