

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

**csvデータ① (カンマ区切り)**

[code]

    No,テスト1,テスト日,New／Existing,テスト名,テスト数,テスト担当,テスト訪問日,テスト名,テスト2,テストフラグ,テスト3,テスト4,テスト5,テスト6,テスト7,テスト8,テスト9,テスト10,テスト11,テスト12,テスト13,テスト14,テスト15,テスト16,テスト17,テスト18,テスト19,テスト20,テスト21,テスト21,テスト22,テスト23,"テスト24
    500","テスト25
    700","テスト26
    200","テスト27
    220","テスト28
    100",テスト29,テスト30,テスト31,テスト32,テスト33,テスト34,テスト35,テスト36,,,
    51,コム,2021/02/26,New,会社A,20,テストA,2021/02/09,テストA,担当者,OK,,0,,,,,,,0,,,,2021/02/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,2021/02/26,Existing,会社B,,,2021/02/26,テストA,担当者,OK,,2,2,,,,,,2,,,,2021/02/01,,2,卸売・小売業,,,2,,,163734,,,2,,,,,,,,,,,,,
    ,,2021/02/26,Existing,会社C,,テストA,2021/02/26,テストA,担当者,OK,,9,9,,,,,,9,,,,2021/02/01,,9,サービス業,9,,,,,346932,,,,,,,,,,,,,,,,
    ,,2021/02/26,New,会社D,,テストA,2021/02/26,テストA,担当者,NG,,3,,,3,,,,0.9,,,,2021/02/01,,3,建設業,3,,,,,77394,3,,,,,,,,,,,,,,,
    11,コム,2020/04/01,New,会社D,2,テストA,2020/03/10,テストA,代表,NG,テスト,0,,,,,,,0,,,,2020/04/01,,0,"建設業
    ",,,,,,,,,,,,,,,,,,,,1234,1234,1234
    51,コム,2021/03/01,,会社E,48,テストA,2021/02/25,テストA,担当者,,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    52,コム,2021/03/01,,会社F,1,テストA,2021/02/25,テストA,担当者,,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,4,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,4,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    
[/code]

**csvデータ② (カンマ区切り)**

[code]

    No,テスト1,テスト日,New／Existing,テスト名,テスト数,テスト担当,テスト訪問日,テスト名,テスト2,テストフラグ,テスト3,テスト4,テスト5,テスト6,テスト7,テスト8,テスト9,テスト10,テスト11,テスト12,テスト13,テスト14,テスト15,テスト16,テスト17,テスト18,テスト19,テスト20,テスト21,テスト21,テスト22,テスト23,"テスト24
    500","テスト25
    700","テスト26
    200","テスト27
    220","テスト28
    100",テスト29,テスト30,テスト31,テスト32,テスト33,テスト34,テスト35,テスト36,,,
    51,コム,2021/02/26,New,会社A,20,テストA,2021/02/09,テストA,担当者,OK,,0,,,,,,,0,,,,2021/02/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,2021/02/26,Existing,会社B,,,2021/02/26,テストA,担当者,OK,,2,2,,,,,,2,,,,2021/02/01,,2,卸売・小売業,,,2,,,163734,,,2,,,,,,,,,,,,,
    ,,2021/02/26,Existing,会社C,,テストA,2021/02/26,テストA,担当者,OK,,9,9,,,,,,9,,,,2021/02/01,,9,サービス業,9,,,,,346932,,,,,,,,,,,,,,,,
    50,コム,2021/03/01,,会社E,48,テストA,2021/02/25,テストA,担当者,NG,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,2021/02/26,New,会社D,,テストA,2021/02/26,テストA,担当者,OK,,3,,,3,,,,0.9,,,,2021/02/01,,3,建設業,3,,,,,77394,3,,,,,,,,,,,,,,,
    11,コム,2020/04/01,New,会社D,2,テストA,2020/03/10,テストA,代表,OK,テスト,0,,,,,,,0,,,,2020/04/01,,0,"建設業
    ",,,,,,,,,,,,,,,,,,,,1234,1234,1234
    51,コム,2021/03/02,,会社E,49,テストA,2021/02/25,テストA,担当者,□,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    52,コム,2021/03/01,,会社F,1,テストA,2021/02/25,テストA,担当者,△,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    91,コム,2021/03/01,,会社G,1,テストA,2021/02/25,テストA,代表,OK,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    57,コム,2021/03/02,,会社H,1,テストA,2021/02/25,テストA,担当者,NG,,0,,,,,,,0,,,,2021/03/01,,0,,,,,,,,,,,,,,,,,,,,,,,
    
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,0,,,,,,,0,,,,#NUM!,,0,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,4,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,4,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    
[/code]

現在の差分出力内容

[code]

    No,テスト1,テスト日,New／Existing,テスト名,テスト数,テスト担当,テスト訪問日,テスト名.1,テスト2,テストフラグ,テスト3,テスト4,テスト5,テスト6,テスト7,テスト8,テスト9,テスト10,テスト11,テスト12,テスト13,テスト14,テスト15,テスト16,テスト17,テスト18,テスト19,テスト20,テスト21,テスト21.1,テスト22,テスト23,"テスト24
    500","テスト25
    700","テスト26
    200","テスト27
    220","テスト28
    100",テスト29,テスト30,テスト31,テスト32,テスト33,テスト34,テスト35,テスト36,Unnamed: 46,Unnamed: 47,Unnamed: 48
    51.0,コム,2021/02/26,New,会社A,20.0,テストA,2021/02/09,テストA,担当者,OK,,0.0,,,,,,,0.0,,,,2021/02/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    ,,2021/02/26,Existing,会社B,,,2021/02/26,テストA,担当者,OK,,2.0,2.0,,,,,,2.0,,,,2021/02/01,,2.0,卸売・小売業,,,2.0,,,163734.0,,,2.0,,,,,,,,,,,,,
    ,,2021/02/26,Existing,会社C,,テストA,2021/02/26,テストA,担当者,OK,,9.0,9.0,,,,,,9.0,,,,2021/02/01,,9.0,サービス業,9.0,,,,,346932.0,,,,,,,,,,,,,,,,
    50.0,コム,2021/03/01,,会社E,48.0,テストA,2021/02/25,テストA,担当者,NG,,0.0,,,,,,,0.0,,,,2021/03/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    ,,2021/02/26,New,会社D,,テストA,2021/02/26,テストA,担当者,OK,,3.0,,,3.0,,,,0.9,,,,2021/02/01,,3.0,建設業,3.0,,,,,77394.0,3.0,,,,,,,,,,,,,,,
    11.0,コム,2020/04/01,New,会社D,2.0,テストA,2020/03/10,テストA,代表,OK,テスト,0.0,,,,,,,0.0,,,,2020/04/01,,0.0,"建設業
    ",,,,,,,,,,,,,,,,,,,,1234.0,1234.0,1234.0
    91.0,コム,2021/03/01,,会社G,1.0,テストA,2021/02/25,テストA,代表,OK,,0.0,,,,,,,0.0,,,,2021/03/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    57.0,コム,2021/03/02,,会社H,1.0,テストA,2021/02/25,テストA,担当者,NG,,0.0,,,,,,,0.0,,,,2021/03/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    
    
[/code]

[code]

    CSV②の方は途中と最後で行を追加しました。
    また、カラムのテストフラグのステータス例：No11をNG→OKに変更しております。
    
    差分のデータを出力されますが、変換していない部分も拾ってしまいます。
    例えばNo51と空白があるNoを拾ってしまします。
    原因は空白でしょうか。
    
[/code]

出力希望結果

[code]

    No,テスト1,テスト日,New／Existing,テスト名,テスト数,テスト担当,テスト訪問日,テスト名.1,テスト2,テストフラグ,テスト3,テスト4,テスト5,テスト6,テスト7,テスト8,テスト9,テスト10,テスト11,テスト12,テスト13,テスト14,テスト15,テスト16,テスト17,テスト18,テスト19,テスト20,テスト21,テスト21.1,テスト22,テスト23,"テスト24
    500","テスト25
    700","テスト26
    200","テスト27
    220","テスト28
    100",テスト29,テスト30,テスト31,テスト32,テスト33,テスト34,テスト35,テスト36,Unnamed: 46,Unnamed: 47,Unnamed: 48
    50.0,コム,2021/03/01,,会社E,48.0,テストA,2021/02/25,テストA,担当者,NG,,0.0,,,,,,,0.0,,,,2021/03/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    ,,2021/02/26,New,会社D,,テストA,2021/02/26,テストA,担当者,OK,,3.0,,,3.0,,,,0.9,,,,2021/02/01,,3.0,建設業,3.0,,,,,77394.0,3.0,,,,,,,,,,,,,,,
    91.0,コム,2021/03/01,,会社G,1.0,テストA,2021/02/25,テストA,代表,OK,,0.0,,,,,,,0.0,,,,2021/03/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    57.0,コム,2021/03/02,,会社H,1.0,テストA,2021/02/25,テストA,担当者,NG,,0.0,,,,,,,0.0,,,,2021/03/01,,0.0,,,,,,,,,,,,,,,,,,,,,,,
    
[/code]

現在のコード  
条件  
tuple に変換してからCSVファイル①、CSVファイル❷の差分を取得を行います。  
その後にOKとNGだけの特定の文字が変換もしくは行を追加されたらデータを取得します。

[code]

    import pandas as pd
    
    #差分抽出方法のコード
    
    #ファイルの読み込み
    df1 = pd.read_csv("20210228.csv",encoding='utf_8_sig')
    print(df1)
    df2 = pd.read_csv("20210301.csv",encoding='utf_8_sig')
    
    # tuple に変換してから差分を取得
    df3 = df2[~df2.apply(tuple,1).isin(df1.apply(tuple,1))]
    
    #特定の文字を検索
    df_h = df3[df3["テストフラグ"].str.contains("OK|NG",na=False)].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)
    
[/code]

変換していない部分を拾えないようにするためにどのようにすれば、よろしいでしょうか。

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


CC BY-SA 4.0
2021-03-01T02:48:06.217
74327
2021-03-01T03:00:18.440
2021-03-01T03:00:18.440
18859
18859
question
python csv
２つファイルのCSVデータ比較について【重複・行の追加・空白】