Пожалуйста, перейдите по этой ссылке, чтобы увидеть данные >панды объединяют два кадра данных и сортируют по сравниваемому столбцу в соседнем столбце

Как я могу сравнить соседний столбец здесь на основе первичного ключа, который здесь Id1 и ID2, например: Lang_1 с Lang_2 , Mat_1 с Mat_2 и т. д., и если какое-либо несоответствие соседнего столбца b/w найдено для этой конкретной строки, то статус должен быть неудачным и если все соседние столбцы будут совпадать, то передайте, как я могу это сделать. Кто-нибудь может мне помочь, пожалуйста.

import pandas as pd

exam_1 = {
  'ID1': ['1', '2', '3', '3', '5', '5'],
  'ID2': ['1', '1', '4', '5', '1', '2'],
  'Mat': [85, 75, 50, 93, 88, 90],
  'Science': [96, 97, 99, 87, 90, 88],
  'Reading': [80, 60, 72, 86, 84, 77],
  'Wiritng': [78, 82, 88, 78, 86, 82],
  'Lang': [77, 79, 77, 72, 90, 92],
}

exam_2 = {
  'ID1': ['1', '2', '3', '3', '5', '5'],
  'ID2': ['1', '1', '4', '5', '1', '2'],
  'Mat': [80, 80, 90, 90, 85, 80],
  'Science': [50, 60, 85, 90, 66, 82],
  'Reading': [60, 75, 55, 90, 85, 60],
  'Wiritng': [56, 66, 90, 82, 60, 80],
  'Lang': [80, 78, 76, 90, 77, 66],
}
df_1 = pd.DataFrame(exam_1)
df_2 = pd.DataFrame(exam_2)

cmp =  pd.merge(df_1, df_2, how="outer", on=['ID1','Id2'], suffixes=("_1", "_2"))
            .set_index('ID1','ID2')
            .sort_index(axis=1)
            .reset_index()

cmp['Status'] = cmp.iloc[:, 2:].apply(lambda x: 'Pass' if x[0]==x[1] else 'Fail', axis =1)
0
Priyanka Kumari 24 Май 2023 в 21:31

2 ответа

IIUC, вы можете использовать:

cmp =  (
    pd.merge(df_1, df_2, how="outer", on=["ID1", "ID2"], suffixes=("_1", "_2"))
        .set_index(["ID1", "ID2"]).sort_index(axis=1)
)
            
cmp["Status"] = (
    np.where(
        (cmp.filter(like="_1").to_numpy() == cmp.filter(like="_2").to_numpy())
            .all(axis=1), "Pass", "Fail")
)

#or, use your approach
#cmp["Status"] = cmp.apply(lambda x: "Pass" if x[0]==x[1] else "Fail", axis=1)

cmp = cmp.reset_index()

Выход :

print(cmp)

  ID1 ID2  Lang_1  Lang_2  ...  Science_2  Wiritng_1  Wiritng_2  Status
0   1   1      77      80  ...         50         78         56    Fail
1   2   1      79      78  ...         60         82         66    Fail
2   3   4      77      76  ...         85         88         90    Fail
3   3   5      72      90  ...         90         78         82    Fail
4   5   1      90      77  ...         66         86         60    Fail
5   5   2      92      66  ...         82         82         80    Fail
0
Timeless 24 Май 2023 в 21:52
Как я могу добавить сюда цвет, если предположим, что для любой строки соседний столбец не соответствует фону обеих ячеек, он должен быть выделен красным, если соответствует, то зеленым, а если один из них пустым, то желтым.
 – 
Priyanka Kumari
24 Май 2023 в 22:17

Измененный код:

import pandas as pd

exam_1 = {
  'ID1': [1, 2, 3, 4, 5, 6],
  'ID2': [1, 2, 3, 4, 5, 6],
  'Mat': [85, 75, 50, 93, 88, 90],
  'Science': [96, 97, 99, 87, 90, 88],
  'Reading': [80, 60, 72, 86, 84, 77],
  'Writing': [78, 82, 88, 78, 86, 82],
  'Lang': [77, 79, 77, 72, 90, 92],
}

exam_2 = {
  'ID1': [1, 2, 3, 4, 5, 6],
  'ID2': [1, 2, 3, 4, 5, 6],
  'Mat': [80, 80, 90, 90, 85, 80],
  'Science': [50, 60, 85, 90, 66, 82],
  'Reading': [60, 75, 55, 90, 85, 60],
  'Writing': [56, 66, 90, 82, 60, 80],
  'Lang': [80, 78, 76, 90, 77, 66],
}

df_1 = pd.DataFrame(exam_1)
df_2 = pd.DataFrame(exam_2)

cmp = pd.merge(df_1, df_2, how="outer", on=['ID1', 'ID2'], suffixes=("_1", "_2")) \
    .set_index(['ID1', 'ID2']) \
    .sort_index(axis=1) \
    .reset_index()

cmp['Status'] = cmp.iloc[:, 3:].apply(lambda x: 'Pass' if x[0] == x[1] else 'Fail', axis=1)

Вот что изменилось:

  1. В словари данных экзамена добавлены 'ID1' и 'ID2', чтобы они соответствовали именам столбцов в операции слияния.
  2. Исправлена ​​опечатка в названии столбца 'Writing'.
  3. Добавлены 'ID1' и 'ID2' в функцию set_index для установки индекса DataFrame.
  4. Скорректировано индексирование iloc в функции apply, чтобы оно начиналось с третьего столбца (iloc[:, 3:]), чтобы исключить несопоставимые столбцы.
  5. Изменена функция lambda, чтобы она возвращала 'Pass', если соседние значения равны (x[0] == x[1]), и 'Fail' в противном случае.

После этих изменений cmp DataFrame будет содержать столбцы ID1, ID2, а также исходные столбцы из df_1 и df_2. Столбец Status будет указывать, совпадают ли соседние значения в каждой строке или нет.

0
Fuat Ulugay 24 Май 2023 в 22:12
Спасибо, но почему вы добавили поле «Имя» в оба фрейма данных?
 – 
Priyanka Kumari
24 Май 2023 в 21:49
Не обращайте внимания на. Я тестировал и копировал данные. поле имени не имеет значения. Это мое плохо.
 – 
Fuat Ulugay
24 Май 2023 в 21:55