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 テーブルを出力することです。
- 変更された行を識別します(int、float、boolean、string のいずれか)
同じ値、古い値、新しい値を持つ行を出力します (理想的には 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
が、これは演習として残しておきます。