74278


**やりたいこと**  
2つのcsvファイルを比較して、両ファイル内の差分を抽出し、別のファイルにデータを書き込みたいです。  
下記のコードのように条件を指定して差分を抽出したいですが途中で行の追加と空白がありますので、  
希望通りの出力結果にならないです。

**csvデータ① (A,B,Cカンマ区切り)**

[code]

    A,B,C
    1,アメリカ,○
    ,カナダ,×
    3,日本,×
    ,イタリア,〇
    5,イギリス,□
    ,,×
    
    
[/code]

**csvデータ② (A,B,Cカンマ区切り)** 変わった部分「★★★」として表示

[code]

    A,B,C
    1,アメリカ,×　→”○”→”×”★★★
    2,カナダ,○　→”×”→”○”★★★
    3,日本,○　→”×”→”○”★★★
    4,タイ,○　→追加された行★★★
    10,ベトナム,○→追加された行★★★
    ,イタリア,〇
    5,イギリス,□
    ,,×
    7,,〇→追加された行★★★
    8,,×→追加された行★★★
    ,ミャンマ,□→追加された行★★★
    
[/code]

現在の出力内容

[code]

    A,B,C
    1.0,アメリカ,○
    ,カナダ,×
    3.0,日本,×
    5.0,イギリス,□→1回目
    ,,×
    5.0,イギリス,□→2回目
    ,,×
    7,,○
    8.0,,×
    ,ミャンマ,□
    
    イギリス,□→変わっていないのに2回分として表示されます。
    途中で列の追加や空白がある場合、変わっていない部分を表示しない方法ありますでしょうか。
    
[/code]

出力希望結果

[code]

    A,B,C
    1,アメリカ,×　→”○”→”×”★★★
    2,カナダ,○　→”×”→”○”★★★
    3,日本,○　→”×”→”○”★★★
    4,タイ,○　→追加された行★★★
    10,ベトナム,○→追加された行★★★
    7,,○→追加された行★★★
    8,,×→追加された行★★★
    ,ミャンマ,□→追加された行★★★
    
[/code]

コード

[code]

    import csv
    import pandas as pd
    
    #差分抽出方法のコード
    
    #ファイルの読み込み
    df1 = pd.read_csv("test1.csv",encoding='utf_8_sig')
    df2 = pd.read_csv("test2.csv",encoding='utf_8_sig')
    
    #ファイルの比較
    df3 = pd.concat([df1.iloc[df1.compare(df2[:len(df1)]).index],df2[len(df1):]])
    #特定の文字を検索
    df_h = df3[df3["C"].str.contains("○|×|□",na=False)].reset_index(drop=True)
    pd.set_option('display.unicode.east_asian_width', True)
    
    #ファイル書き込み
    df_h.to_csv("test.csv",encoding='utf_8_sig',index=False)
    
    
[/code]

わかる方いらっしゃいましたらご教示願います。  
お手数ですが、宜しくお願いいたします。


CC BY-SA 4.0
2021-02-25T09:03:46.227
74271
2021-02-25T12:59:04.340
2021-02-25T09:33:06.660
18859
18859
question
python csv
CSVのデータを比較について【行の追加と空白】


差分を取るのに `isin` を使うのですが、そのままだと `index` も比較対象にしてしまうので、データフレームの行を tuple に変換します。

[code]

    import csv
    import pandas as pd
    
    #差分抽出方法のコード
    
    #ファイルの読み込み
    df1 = pd.read_csv("test1.csv", dtype=str, na_filter=False, encoding='utf_8_sig')
    df2 = pd.read_csv("test2.csv", dtype=str, na_filter=False, encoding='utf_8_sig')
    
    # tuple に変換してから差分を取得
    df3 = df2[~df2.apply(tuple, 1).isin(df1.apply(tuple, 1))]
    
    #特定の文字を検索
    df_h = df3[df3["C"].str.contains("○|×|□")].reset_index(drop=True)
    
    #ファイル書き込み
    df_h.to_csv("test.csv", encoding='utf_8_sig', index=False)
    
    pd.set_option('display.unicode.east_asian_width', True)
    print(df_h)
    =>
        A　　　　　　B  C
    0   1　　 アメリカ  ×
    1   2      カナダ  ○
    2   3　　　　 日本  ○
    3   4　　　　 タイ  ○
    4  10　　 ベトナム  ○
    5   7             ○
    6   8             ×
    7    　　 ミャンマ　 □
    
[/code]


CC BY-SA 4.0
2021-02-25T12:59:04.340
74278
2021-02-25T12:59:04.340
74271
answer