潜在错误:pandas MultiIndex和0-d大小的值

时间:2014-05-23 13:15:10

标签: python pandas

忽略0-d数组是python策略。 0array(0)在技术上没有区别。对于标准熊猫,这是受支持的。但是,MultiIndex并非如此。考虑

import numpy as np
from matplotlib import pyplot
import pandas as pd

np.random.seed(1234)
# params, initials
T = 100 # time
N = 80 # firms
TIndex = np.arange(0, T)
FIndex = np.arange(0, N)

index = pd.MultiIndex.from_product([TIndex, FIndex], names=['time', 'firm'])
df = pd.DataFrame(-999, columns=['A', 'w', 'l', 'a', 'x', 'X', 'd', 'profit'], index=index)
t, n = 0, 2
df.loc[(t,n), 'X'] = np.array(0)

pd.__version__
df.loc[(t,n), 'X']

这会给我一个追溯:

Traceback (most recent call last):
  File "C:\Users\sdaro\AppData\Local\Enthought\Canopy\User\lib\site-packages\IPython\core\interactiveshell.py", line 2883, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-180-766f1cc7a0e5>", line 1, in <module>
    df.loc[(t,n), 'X'] = np.array(0)
  File "C:\Users\sdaro\AppData\Local\Enthought\Canopy\User\lib\site-packages\pandas\core\indexing.py", line 119, in __setitem__
    self._setitem_with_indexer(indexer, value)
  File "C:\Users\sdaro\AppData\Local\Enthought\Canopy\User\lib\site-packages\pandas\core\indexing.py", line 342, in _setitem_with_indexer
    if is_list_like(value) and lplane_indexer != len(value):
TypeError: len() of unsized object

更新

解决第一条评论;我的意思是“在技术上没有区别”是“在大多数情况下”,设计用于接受值的应用程序也应该采用单例。 pandas通常支持这一点,正如

所示
>>> test = pd.DataFrame(index = array([0, 1, 2]), columns=['A'])
>>> test.ix[0, 'A'] = 1
>>> test.ix[1, 'A'] = array(1)
>>> test
Out[190]: 
     A
0    1
1    1
2  NaN

正是在这种特殊情况下,它不起作用,这就是为什么我认为这不是预期的行为。

1 个答案:

答案 0 :(得分:2)

我们在非多索引的情况下接受这个,所以将这称为错误

问题在这里:http://github.com/pydata/pandas/issues/7218

已在此处修复:https://github.com/pydata/pandas/pull/7219