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

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

新規登録して質問してみよう
ただいま回答率
85.48%
pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

4069閲覧

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

barobaro

総合スコア1286

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/01/21 13:06

前提・実現したいこと

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

df1

nonamepointvalue
1A10100
2B11110
4D13130
5E14140

df2

nonamepointvalue
1A10100
2B11200
3C12120
4D15130
5E14

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

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

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

nonamepointvalue
1FalseFalseFalse
2FalseFalseTrue
3FalseFalseFalse
4FalseTrueFalse
5FalseFalseTrue

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

nonamepointvalue
1FalseFalseFalse
2FalseFalseTrue
3TrueTrueTrue
4FalseTrueFalse
5FalseFalseTrue

該当のソースコード

python

1import pandas as pd 2import io 3 4data = '''\ 5no,name,point,value 61,A,10,100 72,B,11,110 84,D,13,130 95,E,14,140 10''' 11df1 = pd.read_csv(io.StringIO(data), header=0, index_col=0) 12 13data = '''\ 14no,name,point,value 151,A,10,100 162,B,11,200 173,C,12,120 184,D,15,130 195,E,14, 20''' 21df2 = pd.read_csv(io.StringIO(data), header=0, index_col=0) 22 23df3 = df2.copy() 24 25df3.update(df1) 26 27df_diff = df2 != df3 28 29df3[df_diff]

試したこと

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

python

1df3 = df1.copy() 2df3.update(df2) 3df_diff = df2 != df3

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

Python

1import pandas as pd 2import numpy as np 3import io 4 5data = ''' 6no,name,point,value 71,A,10,100 82,B,11,110 94,D,13,130 105,E,14,140 11''' 12df1 = pd.read_csv(io.StringIO(data), header=0, index_col=0) 13data = ''' 14no,name,point,value 151,A,10,100 162,B,11,200 173,C,12,120 184,D,15,130 195,E,14, 20''' 21df2 = pd.read_csv(io.StringIO(data), header=0, index_col=0) 22 23df_diff = df2.combine(df1, lambda l,r: l!=r) 24# name point value 25#no 26#1 False False False 27#2 False False True 28#3 True True True 29#4 False True False 30#5 False False True

投稿2020/01/21 16:05

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2020/01/21 23:48

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

0

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

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

python

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

投稿2020/01/21 23:50

barobaro

総合スコア1286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

python

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

投稿2020/01/21 14:54

barobaro

総合スコア1286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問