使用.iat时,Python Pandas TypeError

时间:2019-07-05 15:01:48

标签: python python-3.x pandas

当创建具有两个具有相同列名的列的DataFrame时,使用.iat[i,j]将导致TypeError。 但是,切换到.iloc[i,j]将解决此问题。 在这种情况下,iatiloc为何会有不同的表现?

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()

1 个答案:

答案 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']与具有相同名称的列一起使用,则会出现相同的问题。