【问题标题】:Return cell difference in pandas dataframe返回熊猫数据框中的单元格差异
【发布时间】:2018-10-14 16:32:49
【问题描述】:

这是按预期工作的代码。

来自: Outputting difference in two Pandas dataframes side by side - highlighting the difference

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

DF1 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.11                     False                "Graduated"
113  Zoe    NaN                     True                  " "
""")
DF2 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.21                     False                "Graduated"
113  Zoe    NaN                     False                "On vacation" """)


df1 = pd.read_table(DF1, sep='\s+', index_col='id')
df2 = pd.read_table(DF2, sep='\s+', index_col='id')


df_all = pd.concat([df1, df2], 
                   axis='columns', keys=['First', 'Second'])

df_final = df_all.swaplevel(axis='columns')[df1.columns[1:]]

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)

唯一的问题是我不想要第一行 (111),因为没有区别。

如何在不使用 highlight_diff 函数的情况下只选择更改的行? 我想并排返回第 112 行和第 113 行而不突出显示,如 Ted 的回答所示。

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    df_select = df_final.copy()
    df_select.columns = df_final.columns.swaplevel()
    duplicate = (df_select['First'] == df_select['Second']).all(axis=1)
    df_final = df_final[~duplicate]
    

    说明: 我们创建第二个数据框 df_select 以选择相关行(并复制 df_final 以便您的原始数据不会被更改)。它的列被交换,因此FirstSecond 位于第 0 级。那么你要丢弃的行是那些 First 和 Second 相同的行。我们将df_final 更改为仅包含非重复行。

    编辑:如果您根本不想使用df_final,而是使用df_all

    duplicate = (df_all['First'] == df_all['Second']).drop('Comment', axis=1).all(axis=1)
    result = df_all[~duplicate]
    

    (我假设您不想检查 cmets,类似于之前的过程。如果您确实需要,请删除 drop。)

    【讨论】:

    • 正确。但是是否可以使用 df_all 而不是 df_final 的方法?
    猜你喜欢
    • 1970-01-01
    • 2017-12-30
    • 2021-11-10
    • 1970-01-01
    • 2022-01-12
    • 2022-07-22
    • 2016-01-28
    • 2020-08-17
    • 2018-04-18
    相关资源
    最近更新 更多