Как выделить различия в кадре данных панд после их объединения? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть два кадра данных, как показано ниже:

XYZ
Year Quantity Car     Colour
2001 1000     Swift   Red
2001 16       Wagonar White
2001 16       Wagonar Black
2001 200      Baleno  Silver
2001 20       Zen     White

ABC  
Year Quantity Car     Colour
2001 1000     Swift   Red
2001 16       Wagonar White
2001 200      Baleno  Silver
2001 44       Alto    Blue

, и результат должен выглядеть следующим образом:

Year      Quantity Car             Colour
XYZ  ABC  XYZ  ABC XYZ     ABC     XYZ    ABC
2001 2001 1000 100 Swift   Swift   Red    Red
2001 2001 16   16  Wagonar Wagonar White  White
2001 2001 16       Wagonar         Black 
2001 2001 200  200 Baleno  Baleno  Silver Silver
2001 2001 20       Zen             White
2001 2001      44          Alto           Blue

Я пробовал это

df_all = pd.concat([df_temp, df_temp1], axis='columns', keys=['XYZ', 'ABC'])
print(df_all)
df_final = df_all.swaplevel(axis='columns')[df_temp.columns]
print(df_final)
def highlight_diff(data, color='yellow'):
    attr = 'background-color: {}'.format(color)
    other = data.xs('First', axis='columns', level=-1)
    return pd.DataFrame(np.where(data.ne(other, level=0), attr,''),index=data.index, columns=data.columns)

 df_final.style.apply(highlight_diff, axis=None)
 print(df_final)

Различия между фреймами данных должны быть выделены.

Например, в данном случае автомобили: Wagonar Zen и Alto должны быть выделены, потому что они различаются в двух фреймах данных

Я пробовал этот способ их объединения:

    YEAR Quantity  CAR    COLOR  car     color
0   2001    16    Wagonar white  Wagonar white
1   2001    16    Wagonar black  Wagonar white
2   2001    20    Zen     white  NaN     NaN
3   2001    44    NaN     NaN    Alto    blue
4   2001   200    Baleno  silver Baleno  silver
5   2001  1000    Swift   red    Swift   red

Все заголовки CAPS принадлежат компании xyz, а небольшие заголовки принадлежат abc. Как сравнить столбец «CAR» со столбцом «car», а также столбец «COLOR» со столбцом «color» и выделить всю строку, где значения не соответствуютmatch.

Я пробовал:

def highlight_rows(s):        
if not (s['CAR'] == s['car'] and s['COLOR'] == s['color']):
    return 'background-color: green'

df_final.style.apply(highlight_rows, axis = None)

Но это не работает

1 Ответ

0 голосов
/ 26 февраля 2019

Существует проблема с дублированной парой 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}})

pic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...