У меня есть 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.
Я боролся с этим в течение трех дней и не мог найти решение. Я высоко ценю любую помощь.
Вы можете попробовать с 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
МИУК,
Предположим, что csv1, csv2 импортированы в pandas как 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
@GauravPhagre: просто сделай df1[~df1_mask.all(1)]
. Он покажет только строки, имеющие False
Большое спасибо @Andy. Это помогает. Мне нужно еще одно уточнение. Есть ли способ распечатать/идентифицировать только те строки и столбцы, которые были изменены. Или для чего df1_mask показывает False?