質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

PandasでExcelのシートを比較して差異のあるところを赤色にしたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 507

score 1261

前提・実現したいこと

Excelのシートを比較して差異のあるところを赤色にしたい
styleで色付けできるようなのですが
df2の表に色付けしたい
https://pandas.pydata.org/pandas-docs/version/0.18/style.html

df1

 no   name   point   value 
 1    A      10      100   
 2    B      11      110   
 4    D      13      130   
 5    E      14      140   

df2

 no   name   point   value 
 1    A      10      100   
 2    B      11      200   
 3    C      12      120   
 4    D      15      130   
 5    E      14            

色が付けれないので太字にしたのですがわかりにくので
変更箇所は

+ 2-value 110 → 200
+ 3 列追加
+ 4-point 13 → 15
+ 5-value 140 → 消す 

発生している問題・エラーメッセージ

 no   name    point   value 
 1    False   False   False 
 2    False   False   True  
 3    False   False   False 
 4    False   True    False 
 5    False   False   True  

3行目以外のところは差異を抽出できているのですが
3行目の追加したところの差異がうまくいきません
下のように3行目もTrueにするにはどうすればいいのでしょうか

 no   name    point   value 
 1    False   False   False 
 2    False   False   True  
 3    True    True    True  
 4    False   True    False 
 5    False   False   True  

該当のソースコード

import pandas as pd
import io

data = '''\
no,name,point,value
1,A,10,100
2,B,11,110
4,D,13,130
5,E,14,140
'''
df1 = pd.read_csv(io.StringIO(data), header=0, index_col=0)

data = '''\
no,name,point,value
1,A,10,100
2,B,11,200
3,C,12,120
4,D,15,130
5,E,14,
'''
df2 = pd.read_csv(io.StringIO(data), header=0, index_col=0)

df3 = df2.copy()

df3.update(df1)

df_diff = df2 != df3

df3[df_diff]

試したこと

df1にdf2をupdateして比較しても行数が違うためエラーになる

df3 = df1.copy()
df3.update(df2)
df_diff = df2 != df3

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

サイズの違うデータフレーム間の処理はDataFrame.combine() が使えそうです。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.combine.html#pandas.DataFrame.combine

import pandas as pd
import numpy as np
import io

data = '''
no,name,point,value
1,A,10,100
2,B,11,110
4,D,13,130
5,E,14,140
'''
df1 = pd.read_csv(io.StringIO(data), header=0, index_col=0)
data = '''
no,name,point,value
1,A,10,100
2,B,11,200
3,C,12,120
4,D,15,130
5,E,14,
'''
df2 = pd.read_csv(io.StringIO(data), header=0, index_col=0)

df_diff = df2.combine(df1, lambda l,r: l!=r)
#     name  point  value
#no
#1   False  False  False
#2   False  False   True
#3    True   True   True
#4   False   True  False
#5   False  False   True

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/22 08:48

    magichanさん
    いつもありがとうございます。
    combine_firstは見つかりますがcombineは検索しても見つけることができませんでした。
    またlambda部分を変更すれば色々と使えそうです。
    一緒にcombine_firstも知ることができましたすごい勉強になりました。
    どうもありがとうございました。

    キャンセル

0

差集合でindexを抽出してTrueにできました

s_diff = set(df2.index) - set(df1.index)
df_diff.loc[s_diff,:] = True

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

寝る前に思い付いてたのも書いておきます

reindexでdf1のindexを書き換えてから比較

df3 = df1.reindex(df2.index)
df_diff = df2 != df3

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る