Как применить функцию 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]