У меня есть 2 файла CSV:
CSV1 :
"Hypervisor","IP","ABCD","Operating System","Domain","Memory","No. CPU","Availability (%)","Last Collection Time","lol"
"lglac125.lss.com","10.247.52.125","VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599031E9"
"lglac126.lss.com","10.247.52.126","VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9"
"lglac127.lss.com","10.247.52.127","VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","0.0","1.558599031E9"
"lglac128.lss.com","10.247.52.128","VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9"
"lglac129.lss.com","10.247.52.129","VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9"
CSV2 :
"Hypervisor","IP","Arrays","Operating System","Domain","Memory","No. CPU","Availability (%)","Last Collection Time","DummyColumn"
"lglac125.lss.com","10.247.52.125",,"VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599031E9","A"
"lglac126.lss.com","10.247.52.126",,"VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9","B"
"lglac127.lss.com","10.247.52.127",,"VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","0.0","1.558599031E9","C"
"lglac128.lss.com","10.247.52.128",,"VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9","D"
"lglac129.lss.com","10.247.52.129",,"VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9","E"
"DummyRow","10.247.52.129",,"VMware ESXi 5.5.0 build-9919047","lss.com","524278.03125","4.0","100.0","1.558599931E9","F"
Я пытаюсь сравнить все записи каждого столбца (если доступно в CSV2), с соответствующими строками. Если какая-либо запись отсутствует или изменена, мне нужно поднять флаг. Возможна возможность добавления или удаления любого столбца в обоих файлах. Поэтому мне нужно сначала проверить, есть ли столбец x в csv2, а затем сопоставить запись для того же столбца из csv1.
Я боролся с этим уже три дня и не мог прийти к решению. Я высоко ценю любую помощь.
2 ответа
Вы можете попробовать с merge
и indicator=True
и query()
both
:
matching_cols=df1.columns.intersection(df2.columns).tolist() #find matching columns to merge
df1.merge(df2,on=matching_cols,how='outer',indicator=True).query("_merge!='both'")
Это покажет вам необычные данные между фреймами данных
Hypervisor IP Operating System \
0 lglac125.lss.emc.com 10.247.52.125 VMware ESXi 5.5.0 build-9919047
5 lglac125.lss.emc.com VMware ESXi 5.5.0 build-9919047
6 DummyRow 10.247.52.129 VMware ESXi 5.5.0 build-9919047
Domain Memory No. CPU Availability (%) Last Collection Time \
0 lss.emc.com 524278.03125 4.0 100.0 1.558599e+09
5 lss.emc.com 524278.03125 4.0 100.0 1.558599e+09
6 lss.emc.com 524278.03125 4.0 100.0 1.558600e+09
Arrays DummyColumn _merge
0 NaN NaN left_only
5 NaN A right_only
6 NaN F right_only
IIUC ,
Предположим, что csv1, csv2 импортированы в панды как df1
, df2
. Найдите подходящие столбцы, используя intersection
для столбцов, и сортируйте их. Передав его df1
и df2
. Наконец, eq
в этом подмножестве совпадающих столбцов df1
и df2
matched_list = df1.columns.intersection(df2.columns).sort_values()
df1_mask = df1[matched_list].eq(df2[matched_list])
Out[853]:
Availability (%) Domain Hypervisor IP Last Collection Time Memory \
0 True True True False True True
1 True True True True True True
2 True True True True True True
3 True True True True True True
4 True True True True True True
5 False False False False False False
No. CPU Operating System
0 True True
1 True True
2 True True
3 True True
4 True True
5 False False
Примечание : я изменяю df1.loc[0, 'IP']
на 10.247.52.124
, чтобы показать False
в одном значении строки 0 из df1
для демонстрации
Из этого df1_mask
вы можете подключить его к df1
для проверки NaN
. Любое NaN
является либо исходным значением NaN
, либо оно изменяется между df1
и df2
df1[df1_mask]
Out[854]:
Hypervisor IP Operating System Domain \
0 lglac125.lss.com NaN VMware ESXi 5.5.0 build-9919047 lss.com
1 lglac126.lss.com 10.247.52.126 VMware ESXi 5.5.0 build-9919047 lss.com
2 lglac127.lss.com 10.247.52.127 VMware ESXi 5.5.0 build-9919047 lss.com
3 lglac128.lss.com 10.247.52.128 VMware ESXi 5.5.0 build-9919047 lss.com
4 lglac129.lss.com 10.247.52.129 VMware ESXi 5.5.0 build-9919047 lss.com
Memory No. CPU Availability (%) Last Collection Time lol
0 524278.03125 4.0 100.0 1.558599e+09 NaN
1 524278.03125 4.0 100.0 1.558600e+09 NaN
2 524278.03125 4.0 0.0 1.558599e+09 NaN
3 524278.03125 4.0 100.0 1.558600e+09 NaN
4 524278.03125 4.0 100.0 1.558600e+09 NaN
Примечание : у вашего df1
есть столбец lol
, но нет значения, поэтому он изначально NaN
Или Вы можете проверить df2
df2[df1_mask]
Out[855]:
Hypervisor IP Arrays Operating System \
0 lglac125.lss.com NaN NaN VMware ESXi 5.5.0 build-9919047
1 lglac126.lss.com 10.247.52.126 NaN VMware ESXi 5.5.0 build-9919047
2 lglac127.lss.com 10.247.52.127 NaN VMware ESXi 5.5.0 build-9919047
3 lglac128.lss.com 10.247.52.128 NaN VMware ESXi 5.5.0 build-9919047
4 lglac129.lss.com 10.247.52.129 NaN VMware ESXi 5.5.0 build-9919047
5 NaN NaN NaN NaN
Domain Memory No. CPU Availability (%) Last Collection Time \
0 lss.com 524278.03125 4.0 100.0 1.558599e+09
1 lss.com 524278.03125 4.0 100.0 1.558600e+09
2 lss.com 524278.03125 4.0 0.0 1.558599e+09
3 lss.com 524278.03125 4.0 100.0 1.558600e+09
4 lss.com 524278.03125 4.0 100.0 1.558600e+09
5 NaN NaN NaN NaN NaN
DummyColumn
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.