2016-10-21 279 views
2

首先,我在一个jupyter笔记本中使用python 3.50。Python熊猫Multindex列

我想创建一个DataFrame来显示报表中的一些数据。我希望它有两个索引栏(如果引用它的术语不正确,请不要用它来处理熊猫)。

我有这样的示例代码工作的:

frame = pd.DataFrame(np.arange(12).reshape((4, 3)), 
        index =[['a', 'a', 'b', 'b'], [1, 2, 1, 2]], 
        columns =[['Ohio', 'Ohio', 'Ohio'], ['Green', 'Red', 'Green']]) 

但是,当我试图把它带到我的情况下,它给了我一个错误:

cell_rise_Inv= pd.DataFrame([[0.00483211, 0.00511619, 0.00891821, 0.0449637, 0.205753], 
          [0.00520049, 0.00561577, 0.010993, 0.0468998, 0.207461], 
          [0.00357213, 0.00429087, 0.0132186, 0.0536389, 0.21384], 
          [-0.0021868, -0.0011312, 0.0120546, 0.0647213, 0.224749], 
          [-0.0725403, -0.0700884, -0.0382486, 0.0899121, 0.313639]], 
          index =[['transition [ns]','transition [ns]','transition [ns]','transition [ns]','transition [ns]'], 
            [0.0005, 0.001, 0.01, 0.1, 0.5]], 
          columns =[[0.01, 0.02, 0.05, 0.1, 0.5],['capacitance [pF]','capacitance [pF]','capacitance [pF]','capacitance [pF]','capacitance [pF]']]) 
cell_rise_Inv 

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-89-180a1ad88403> in <module>() 
     6        index =[['transition [ns]','transition [ns]','transition [ns]','transition [ns]','transition [ns]'], 
     7         [0.0005, 0.001, 0.01, 0.1, 0.5]], 
----> 8        columns =[[0.01, 0.02, 0.05, 0.1, 0.5],['capacitance [pF]','capacitance [pF]','capacitance [pF]','capacitance [pF]','capacitance [pF]']]) 
     9 cell_rise_Inv 

C:\Users\Josele\Anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy) 
    261      if com.is_named_tuple(data[0]) and columns is None: 
    262       columns = data[0]._fields 
--> 263      arrays, columns = _to_arrays(data, columns, dtype=dtype) 
    264      columns = _ensure_index(columns) 
    265 

C:\Users\Josele\Anaconda3\lib\site-packages\pandas\core\frame.py in _to_arrays(data, columns, coerce_float, dtype) 
    5350  if isinstance(data[0], (list, tuple)): 
    5351   return _list_to_arrays(data, columns, coerce_float=coerce_float, 
-> 5352        dtype=dtype) 
    5353  elif isinstance(data[0], collections.Mapping): 
    5354   return _list_of_dict_to_arrays(data, columns, 

C:\Users\Josele\Anaconda3\lib\site-packages\pandas\core\frame.py in _list_to_arrays(data, columns, coerce_float, dtype) 
    5429   content = list(lib.to_object_array(data).T) 
    5430  return _convert_object_array(content, columns, dtype=dtype, 
-> 5431         coerce_float=coerce_float) 
    5432 
    5433 

C:\Users\Josele\Anaconda3\lib\site-packages\pandas\core\frame.py in _convert_object_array(content, columns, coerce_float, dtype) 
    5487    # caller's responsibility to check for this... 
    5488    raise AssertionError('%d columns passed, passed data had %s ' 
-> 5489         'columns' % (len(columns), len(content))) 
    5490 
    5491  # provide soft conversion of object dtypes 

AssertionError: 2 columns passed, passed data had 5 columns 

任何想法?我不明白为什么这个例子有效,我不这样做。 :S

谢谢提前:)。

+0

错误表明您没有传入与索引匹配的形状的数据:AssertionError:传递了2列,传递的数据有5列 –

+0

看起来您的索引重复5次“电容[pF]”,而数据只有两列... –

+0

另外,您可能想要切换标签的顺序(''capacitance [pF]'')和多索引中的数字。 –

回答

2

还有就是你的代码和例子之间的一个主要区别:例如通过一个numpy阵列作为输入,而不是一个嵌套列表。事实上,加入np.array(...)在你的列表中工作得很好:

 
cell_rise_Inv= pd.DataFrame(
     np.array([[0.00483211, 0.00511619, 0.00891821, 0.0449637, 0.205753], 
        [0.00520049, 0.00561577, 0.010993, 0.0468998, 0.207461], 
        [0.00357213, 0.00429087, 0.0132186, 0.0536389, 0.21384], 
        [-0.0021868, -0.0011312, 0.0120546, 0.0647213, 0.224749], 
        [-0.0725403, -0.0700884, -0.0382486, 0.0899121, 0.313639]]), 
     index=[['transition [ns]'] * 5, 
       [0.0005, 0.001, 0.01, 0.1, 0.5]], 
     columns=[['capacitance [pF]'] * 5, 
       [0.01, 0.02, 0.05, 0.1, 0.5]]) 

我缩短了重复的字符串在索引和交换的指数级别的顺序,但这些都不是显著的变化。

编辑 做了一些调查。如果您通过嵌套列表(没有np.array呼叫),则该呼叫将在没有columns的情况下运行,即使columns是一维列表。出于某种原因,除非输入为ndarray,否则两个元素的嵌套列表不会被解释为多指数。

I根据这个问题提交了issue #14467熊猫。

2

它确实看起来不一致。我会用pd.MultiIndex构造from_arrays

idx = pd.MultiIndex.from_arrays([['transition [ns]'] * 5, 
           [0.0005, 0.001, 0.01, 0.1, 0.5]]) 
col = pd.MultiIndex.from_arrays([[0.01, 0.02, 0.05, 0.1, 0.5], 
           ['capacitance [pF]'] * 5]) 

cell_rise_Inv= pd.DataFrame([[0.00483211, 0.00511619, 0.00891821, 0.0449637, 0.205753], 
          [0.00520049, 0.00561577, 0.010993, 0.0468998, 0.207461], 
          [0.00357213, 0.00429087, 0.0132186, 0.0536389, 0.21384], 
          [-0.0021868, -0.0011312, 0.0120546, 0.0647213, 0.224749], 
          [-0.0725403, -0.0700884, -0.0382486, 0.0899121, 0.313639]], 
          index=idx, 
          columns=col) 
cell_rise_Inv 

enter image description here

+0

我的不好。我没有完整阅读OP的输出。 Downvote删除。缓慢的一天,不打算把它拿出来。 –

+0

@MadPhysicist对评论投票并纠正错误的评价。我最近错误地关闭了某些人,因为我很累......发生了。 – piRSquared