Существует проблема с дублированной парой Year
и Quantity
, поэтому возможное решение - создать уникальный MultiIndex
со счетчиком до concat
:
df_temp.index = df_temp.groupby(['Year','Quantity']).cumcount()
df_temp1.index = df_temp1.groupby(['Year','Quantity']).cumcount()
df_all = (pd.concat([df_temp.set_index(['Year','Quantity'], append=True),
df_temp1.set_index(['Year','Quantity'], append=True)],
axis='columns',
keys=['XYZ', 'ABC']))
print(df_all)
XYZ ABC
Car Colour Car Colour
Year Quantity
0 2001 16 Wagonar White Wagonar White
20 Zen White NaN NaN
44 NaN NaN Alto Blue
200 Baleno Silver Baleno Silver
1000 Swift Red Swift Red
1 2001 16 Wagonar Black NaN NaN
Затем преобразовать index
в DataFrame
и concat
снова для MultiIndex
:
df = df_all.index.to_frame().drop(0, axis=1)
df1 = pd.concat([df, df], axis=1, keys=('XYZ','ABC'))
print (df1)
XYZ ABC
Year Quantity Year Quantity
Year Quantity
0 2001 16 2001 16 2001 16
20 2001 20 2001 20
44 2001 44 2001 44
200 2001 200 2001 200
1000 2001 1000 2001 1000
1 2001 16 2001 16 2001 16
df_final = df_all.join(df1).reset_index(drop=True).swaplevel(axis='columns')[df_temp.columns]
print(df_final)
Year Quantity Car Colour
XYZ ABC XYZ ABC XYZ ABC XYZ ABC
0 2001 2001 16 16 Wagonar Wagonar White White
1 2001 2001 20 20 Zen NaN White NaN
2 2001 2001 44 44 NaN Alto NaN Blue
3 2001 2001 200 200 Baleno Baleno Silver Silver
4 2001 2001 1000 1000 Swift Swift Red Red
5 2001 2001 16 16 Wagonar NaN Black NaN
Последнее добавление новой маски и комбинирование по битам или - |
:
def highlight_diff(data, color='yellow'):
attr = 'background-color: {}'.format(color)
other1 = data.xs('XYZ', axis='columns', level=-1)
other2 = data.xs('ABC', axis='columns', level=-1)
return pd.DataFrame(np.where(data.ne(other1, level=0) |
data.ne(other2, level=0), attr,''),
index=data.index, columns=data.columns)
df_final = pd.DataFrame({('Year', 'XYZ'): {0: 2001, 1: 2001, 2: 2001, 3: 2001, 4: 2001, 5: 2001}, ('Year', 'ABC'): {0: 2001, 1: 2001, 2: 2001, 3: 2001, 4: 2001, 5: 2001}, ('Quantity', 'XYZ'): {0: 16, 1: 20, 2: 44, 3: 200, 4: 1000, 5: 16}, ('Quantity', 'ABC'): {0: 16, 1: 20, 2: 44, 3: 200, 4: 1000, 5: 16}, ('Car', 'XYZ'): {0: 'Wagonar', 1: 'Zen', 2: np.nan, 3: 'Baleno', 4: 'Swift', 5: 'Wagonar'}, ('Car', 'ABC'): {0: 'Wagonar', 1: np.nan, 2: 'Alto', 3: 'Baleno', 4: 'Swift', 5: np.nan}, ('Colour', 'XYZ'): {0: 'White', 1: 'White', 2: np.nan, 3: 'Silver', 4: 'Red', 5: 'Black'}, ('Colour', 'ABC'): {0: 'White', 1: np.nan, 2: 'Blue', 3: 'Silver', 4: 'Red', 5: np.nan}})
