当创建具有两个具有相同列名的列的DataFrame时,使用.iat[i,j]
将导致TypeError。
但是,切换到.iloc[i,j]
将解决此问题。
在这种情况下,iat
与iloc
为何会有不同的表现?
python版本:3.6.1 熊猫版本:0.20.1
import pandas as pd
x = pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','a'])
x.iloc[1,1] # works fine
x.iat[1,1] # TypeError
TypeError:未调整大小的对象的len()
答案 0 :(得分:0)
当列名不唯一时,您遇到的情况是遇到了充当索引器的函数:
def _iget_item_cache(self, item):
"""Return the cached item, item represents a positional indexer."""
ax = self._info_axis
if ax.is_unique:
lower = self._get_item_cache(ax[item])
else:
lower = self._take(item, axis=self._info_axis_number,
convert=True)
return lower
由于ax.is_unique
为假,因此对self._take
进行了调用,问题在于此函数调用maybe_convert_indices
,该函数期望一个数组,但仅获取一个int
,并且程序崩溃,因为mask = indices < 0
是布尔型,没有.any()
方法
两种解决方案:
优点:
避免使用相同的命名列,您的程序可以通过x = pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c'])
丑陋:
修改窗格源并更改
lower = self._take(item, axis=self._info_axis_number, convert=True)
与
lower = self._take([item], axis=self._info_axis_number, convert=True)
PS:
如果将x.at[1,'b']
与具有相同名称的列一起使用,则会出现相同的问题。