Метод применения фрейма данных не обновляет все строки

#python #pandas

Вопрос:

Я сравниваю исходный и целевой набор данных(9000 строк,14 столбцов) и выделяю разницу, используя приведенный ниже код. здесь с помощью apply метода я вызываю функцию. но проблема в том, что выделение различий работает до некоторых строк, после чего строки не выделяют различия. Не уверен, в чем заключается ограничение, или я что-то здесь упускаю?

Примечание: Я не уверен,как прикрепить файл набора данных к этому вопросу, но я использую образец csv с 9000 строками и 14 столбцами отсюда

пример здесь, в первой записи, подчеркивает разницу, введите описание изображения здесь

но после идентификатора 4144 он не выделяет его.

введите описание изображения здесь

ниже приведен мой полный код-

 import pandas as pd
import numpy as np
from IPython.display import display, HTML

def join_datasets(source, target):
    source_df = pd.read_csv(source)
    target_df = pd.read_csv(target)
    combined_df = pd.concat([source_df.set_index('id'), target_df.set_index('id')], 
                            axis='columns', keys=['Source', 'Target'])
    combined_df = combined_df.swaplevel(axis='columns')[source_df.columns[1:]]
    return combined_df

def highlight_diff(data, color='yellow'):
    attr = 'background-color: {}'.format(color)
    other = data.xs('Source', axis='columns', level=-1)
    return pd.DataFrame(np.where(data.ne(other, level=0), attr, ''),
                        index=data.index, columns=data.columns)

custom_style = [
    {
        'selector':'caption',
        'props':[('font-weight', 'bold'),('margin-bottom','25px'),('font-size','25px')]
    },
    {  
        'selector': '',
        'props': [('border-collapse', 'collapse'),('margin', '100px auto')]
    },
    {  
        'selector': 'table',
        'props': [('border-collapse', 'collapse'),('margin', '100px auto')]
    },
    {  
        'selector': 'tbody',
        'props': [('border', '1px solid #A2DBFA')]
    },
    {
        'selector': 'td',
        'props': [('border', '1px solid #A2DBFA'),('padding','1em'),('border-bottom','2px solid #A2DBFA')]
    },
    {
        'selector': 'th',
        'props': [('border', '1px solid #A2DBFA'),('padding','1em'),('background-color','#39A2DB'),('border-bottom','2px solid #A2DBFA')]
    }
]

df = join_datasets('source.csv', 'target.csv')
df = df.style.set_table_styles(custom_style, overwrite=True).set_caption("Test Case 1").apply(highlight_diff, axis=None)
df
 

Комментарии:

1. 1. уменьшите свой фрейм данных до размера, достаточного для вставки в виде csv, убедитесь, что проблема все еще сохраняется. 2. Разделите свои проблемы: это ошибка jupyter или вы highlight_diff делаете что-то странное? Можете ли вы добавить столбец «выделено» с True/False, чтобы узнать, является ли это проблемой визуализации или данных? 3. Не используйте Jupyter так, как будто это excel.

2. @Ufos — это не проблема Jupyter, и я тоже использую pycharm, и у меня та же проблема. и если я уменьшу запись до 1000 ,она будет работать нормально. я думаю, что где-то есть проблема с apply(highlight_diff, ось=Нет), и эта проблема существует как в excel, так и в csv

3. Если вы не опубликуете полный набор данных, никто не сможет узнать причину. Вы говорите, что проблема возникает и с excel, так что это не проблема панд/питона. Возможно, проблема в самих данных или в компьютере, который вы используете.

4. @Mohammad, можете ли вы сообщить мне, как мне прикрепить сюда файл набора данных?

5. Я протестировал это в JupyterLab v. 3.0.16, и все 9000 ячеек выделяются. Я поддерживаю @Ufos в этом вопросе и предполагаю, что у вас может возникнуть проблема с рендерингом.