我在面具中查询-我的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
我不知道d列中的480是哪里来的。
现在x ['d']现在是[1 b 480] b很清楚,但是480来自哪里?我想我缺少有关口罩工作原理的东西
谢谢。
答案 0 :(得分:1)
如果将DataFrame
分配给一个列,而将DataFrame
的第一列分配给它,则看起来是设计使然。
它使用第一列,就像未指定的列一样-在这里使用DataFrame.mask
,因为x
传递给mask
(x
之后未指定列名):< / p>
#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
,此处为{{1} },x['d']
:
x['b']