Как применить функцию concat с параметром axis ='columns' к двум идентичным по размеру фреймам?

Есть два фрейма данных одинакового размера. Основная задача состоит в том, чтобы найти различия в ячейках и строках. Как первым шагом на пути решения вижу применение следующего кода:

df_all = pd.concat([df1, df2],axis='columns', keys=['First', 'Second'], sort=False)

Возникает ошибка:

ValueError                                Traceback (most recent call last)
<ipython-input-10-01a02b58a93b> in <module>
----> 1 df_all = pd.concat([df1, df2],axis='columns', keys=['First', 'Second'], sort=False)
      2 
      3 df_all

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/reshape/concat.py in concat(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)
    285     )
    286 
--> 287     return op.get_result()
    288 
    289 

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/reshape/concat.py in get_result(self)
    500                 mgrs_indexers.append((obj._mgr, indexers))
    501 
--> 502             new_data = concatenate_block_managers(
    503                 mgrs_indexers, self.new_axes, concat_axis=self.bm_axis, copy=self.copy,
    504             )

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/internals/concat.py in concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy)
     82         blocks.append(b)
     83 
---> 84     return BlockManager(blocks, axes)
     85 
     86 

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/internals/managers.py in __init__(self, blocks, axes, do_integrity_check)
    147 
    148         if do_integrity_check:
--> 149             self._verify_integrity()
    150 
    151         # Populate known_consolidate, blknos, and blklocs lazily

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/internals/managers.py in _verify_integrity(self)
    324         for block in self.blocks:
    325             if block.shape[1:] != mgr_shape[1:]:
--> 326                 raise construction_error(tot_items, block.shape[1:], self.axes)
    327         if len(self.items) != tot_items:
    328             raise AssertionError(

ValueError: Shape of passed values is (113, 56), indices imply (110, 56) 

Хоть и фреймы одинакового размера.


Ответы (1 шт):

Автор решения: MaxU

Если правильно спарсить фреймы из приведенного примера данных то все отрабатывает без ошибок:

In [26]: df1 = pd.read_excel("пример датафреймов.xlsx", sheet_name="df1", skiprows=1)

In [27]: df2 = pd.read_excel("пример датафреймов.xlsx", sheet_name="df2", skiprows=1)

In [28]: df_all = pd.concat([df1, df2],axis='columns', keys=['First', 'Second'], sort=False)

результат:

In [29]: df_all
Out[29]:
                                                 First  ...                                                                                                                     Second
                                                 Index  ... Показатель объема финансовых потребностей, направленных на хозяйственное обеспечение текущей деятельности (Ф хо) Факт 2015
0                                                    2  ...                                2021-04-09 00:00:00
1      ВСЕГО по инвестиционной программе, в том числе:  ...                                             341.17
2                 Технологическое присоединение, всего  ...                                                 нд
3    Реконструкция, модернизация, техническое перев...  ...                                                 нд
4    Инвестиционные проекты, реализация которых обу...  ...                                                 нд
..                                                 ...  ...                                                ...
108  Создание системы централизованного мониторинга...  ...                                                 нд
109  Оснащение системой мониторинга высоковольтных ...  ...                                                 нд
110  Создание системы видеоконференцсвязи (ВКС) АО ...  ...                                                 нд
111  Создание системы телеуправления выключателями ...  ...                                                 нд
112                                         Моя строка  ...                                                 нд

[113 rows x 58 columns]
→ Ссылка