Многозначный столбец Python pandas

#python #pandas #jupyter-notebook

#python #pandas #jupyter-записная книжка

Вопрос:

Прежде всего, я использую python 3.50 в ноутбуке jupyter.

Я хочу создать DataFrame для отображения некоторых данных в отчете. Я хочу, чтобы в нем было два индексных столбца (извините, если термин для его обозначения неверен. Я не привык работать с pandas).

У меня есть этот пример кода, который работает:

 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:UsersJoseleAnaconda3libsite-packagespandascoreframe.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:UsersJoseleAnaconda3libsite-packagespandascoreframe.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:UsersJoseleAnaconda3libsite-packagespandascoreframe.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:UsersJoseleAnaconda3libsite-packagespandascoreframe.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

Заранее благодарю вас :).

Комментарии:

1. Ошибка указывает на то, что вы не передаете данные формы, соответствующей индексу: ошибка утверждения: передано 2 столбца, переданные данные содержали 5 столбцов

2. Похоже, что ваш индекс повторяется 'capacitance [pF]' 5 раз, в то время как данные содержат только два столбца…

3. Кроме того, вы можете захотеть изменить порядок меток ( 'capacitance [pF]' ) и чисел в мультииндексе.

4. Что вы имеете в виду, говоря «Можете ли вы показать фактическую строку, которую вы запускаете, со всеми входными данными?»?

5. Извините, я неправильно истолковал ваш вывод, поскольку все это является частью ошибки. Не знал, что у вас есть входные данные вверху. Я чувствую себя идиотом.

Ответ №1:

Существует одно существенное различие между вашим кодом и примером: в примере в качестве входных данных передается 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=[['переход [ns]'] * 5, 
 [0.0005, 0.001, 0.01, 0.1, 0.5]], 
 столбцы =[['емкость [пФ]'] * 5, 
 [0.01, 0.02, 0.05, 0.1, 0.5]])

Я сократил повторяющиеся строки в индексе и поменял порядок уровней индекса, но это несущественные изменения.

EDIT Провел небольшое расследование. Если вы передаете вложенный список (без np.array вызова), вызов будет работать без columns и даже если columns это одномерный список. По какой-то причине вложенный список из двух элементов не интерпретируется как многоиндексный, если входными данными не является ndarray .

Я отправил выпуск # 14467 в pandas на основе этого вопроса.

Ответ №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
  

введите описание изображения здесь

Комментарии:

1. Виноват. Я не полностью прочитал вывод OP. Удален понижающий голос. Медленный день, не собирался вымещать это на вас.

2. Спасибо @MadPhysicist за оставленный комментарий к голосованию «против» и за исправление ошибки. Недавно я по ошибке закрыл чей-то пост, потому что устал… это происходит.