我对Python比较陌生,而且我现在陷入困境
frame = DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.iloc[:,0]
frame.sub(series, axis = 1,fill_value=0)
发出此错误, _ combine_match_columns中的C:\ Anaconda \ lib \ site-packages \ pandas \ core \ frame.pyc(self,other,func,level,fill_value) 3470如果fill_value不是None: 3471引发NotImplementedError("不支持fill_value%r"% - > 3472 fill_value) 3473 3474 new_data = left._data.eval(
NotImplementedError: fill_value 0 not supported
但在Dataframe.sub
方法的文档中,支持fill_value
参数。
有人可以解释这个错误吗?
答案 0 :(得分:0)
此处的fill_value和相关错误消息似乎是红色鲱鱼。换句话说,sub()
被这里的对齐方式弄糊涂了,恰好是fill_value崩溃了。
要查看此信息,请取出填充值:
frame.sub(series, axis = 1)
Out[194]:
Ohio Oregon Texas Utah b d e
Utah NaN NaN NaN NaN NaN NaN NaN
Ohio NaN NaN NaN NaN NaN NaN NaN
Texas NaN NaN NaN NaN NaN NaN NaN
Oregon NaN NaN NaN NaN NaN NaN NaN
几乎可以肯定这不是您想要的。现在,如果您检查series
,您会发现它的名称为'b':
series.name
Out[197]: 'b'
但是熊猫似乎并没有自动将名为“ b”的系列与框架的“ b”列对齐。我不知道是否应该这样做,但是@AntonProtopopv的注释中建议的修复程序允许熊猫正确地对列“ b”进行对齐。
frame.sub(series.to_frame(), axis = 1)
Out[195]:
b d e
Utah 0.0 NaN NaN
Ohio 0.0 NaN NaN
Texas 0.0 NaN NaN
Oregon 0.0 NaN NaN
我不确定您要在此处执行的操作到底是什么,但是无论如何,如果首先对齐后对齐,则fill_value应该可以按预期工作。或说实话,我可能会在@NickilMaveli建议的方法链中仅使用fillna
,因为这似乎是一种更明确(因而更好)的填充缺失值的方法。
最后一点:如果您要在此处使用numpy广播(即从所有列中减去列“ b”),通常通常更容易先转换为数组,然后执行减法之类的操作。
frame.values - series.values.reshape(4,1)
Out[204]:
array([[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.]])