2つのデータフレームを比較し、その違いを並べて出力する 質問する

2つのデータフレームを比較し、その違いを並べて出力する 質問する

2 つのデータフレーム間で何が変更されたかを正確に強調表示しようとしています。

2 つの Python Pandas データフレームがあるとします。

"StudentRoster Jan-1":
id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.11                     False                Graduated
113  Zoe    4.12                     True       

"StudentRoster Jan-2":
id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.21                     False                Graduated
113  Zoe    4.12                     False                On vacation

私の目標は、次のような HTML テーブルを出力することです。

  1. 変更された行を識別します(int、float、boolean、string のいずれか)
  2. 同じ値、古い値、新しい値を持つ行を出力します (理想的には HTML テーブルに)。これにより、ユーザーは 2 つのデータフレーム間で何が変更されたかを明確に確認できます。

    "StudentRoster Difference Jan-1 - Jan-2":  
    id   Name   score                    isEnrolled           Comment
    112  Nick   was 1.11| now 1.21       False                Graduated
    113  Zoe    4.12                     was True | now False was "" | now   "On   vacation"
    

行ごと、列ごとに比較することもできると思いますが、もっと簡単な方法はありますか?

ベストアンサー1

最初の部分は Constantine と似ており、どの行が空であるかのブール値を取得できます*:

In [21]: ne = (df1 != df2).any(1)

In [22]: ne
Out[22]:
0    False
1     True
2     True
dtype: bool

次に、どのエントリが変更されたかを確認します。

In [23]: ne_stacked = (df1 != df2).stack()

In [24]: changed = ne_stacked[ne_stacked]

In [25]: changed.index.names = ['id', 'col']

In [26]: changed
Out[26]:
id  col
1   score         True
2   isEnrolled    True
    Comment       True
dtype: bool

ここで、最初のエントリはインデックスであり、2 番目のエントリは変更された列です。

In [27]: difference_locations = np.where(df1 != df2)

In [28]: changed_from = df1.values[difference_locations]

In [29]: changed_to = df2.values[difference_locations]

In [30]: pd.DataFrame({'from': changed_from, 'to': changed_to}, index=changed.index)
Out[30]:
               from           to
id col
1  score       1.11         1.21
2  isEnrolled  True        False
   Comment     None  On vacation

df1* 注意: ここでは、 と が同じインデックスを共有していることが重要ですdf2。この曖昧さを克服するには、 を使用して共有ラベルのみを確認するようにすることができますdf1.index & df2.indexが、これは演習として残しておきます。

おすすめ記事