89423


### やりたいこと

PythonでBook1とBook2のエクセルを比較します。  
Book1には無い行を、Book2のヘッダーFlagとしてどの行がないかを記載したいです。

両方のエクセルのキーとなるものはtitleにしています。

Book1のエクセル

[code]

    created_at,title,messageId,content
    2022-06-16T06:43:17.488Z,日本,2332528852,雨
    
[/code]

Book2のエクセル

[code]

    created_at,title,messageId,content
    2022-06-16T02:28:37.323Z,アメリカ,2332528842,晴れ
    2022-06-16T02:28:37.323Z,スペイン,2332528843,,
    2022-06-16T06:43:17.488Z,日本,2332528852,雨,
    2022-06-16T02:28:37.323Z,カナダ,2332528853,,
    
[/code]

### 実現したい結果

Book2にFlagの列を追加して、Book1に行がなければ、Nothingとして記入したいです。

[code]

    created_at,title,messageId,content,Flag
    2022-06-16T02:28:37.323Z,アメリカ,2332528842,晴れ,Nothing
    2022-06-16T02:28:37.323Z,スペイン,2332528843,,Nothing
    2022-06-16T06:43:17.488Z,日本,2332528852,雨,
    2022-06-16T02:28:37.323Z,カナダ,2332528853,,Nothing
    
[/code]

**現在の結果**  
特にエラーなく処理されていますが、NothingのFlagはアメリカだけ記入されます。  
他の行もないので、実現したい結果のように記入したいです。

何かクエリで検索する際に間違っていますでしょうか。  
もし分かる方がいましたら、教えていただけますか。

お手数ですが、よろしくお願いいたします。

全体のコード

[code]

    import pandas as pd
    
    #ファイル名
    Book1=r"test.xlsx"
    Book2=r"test2.xlsx"
    
    #Book1エクセル読み込み
    df1 = pd.read_excel(Book1)
    #Book2エクセル読み込み
    df2 = pd.read_excel(Book2)
    
    #df2のエクセルにヘッダー追加
    df2['Flag'] = ""
    #df2['コメントフラグ'] = ""
    print(df2)
    
    #title keyにして行数を確認
    df1_list = df1[['title']].values.tolist()
    print(df1_list)
    
    #1行ずつtitleを比較して一致しなければ、Nothingとしてフラグをつける
    for curtitle in df1_list:
        wdf = df2.query('(title != @curtitle)')
        #if len(wdf) <= 0: continue
        df2.at[wdf.index[0], 'Flag'] = "Nothing"
    
    #結果をxlsxとして書き出し
    df2.to_excel(Book2, sheet_name="Sheet1", index=False, header=True)
    
[/code]


CC BY-SA 4.0
2022-06-16T09:42:24.750
89421
2022-06-17T03:34:10.573
2022-06-17T03:34:10.573
3060
18859
question
python python3 pandas
Pandasを使った行の比較方法について


I used Google Translate, so it might be unnatural.  
より良いPandas関数があるようですが、原始的な方法で作成しました。

[code]

    #1行ずつtitleを比較して一致しなければ、Nothingとしてフラグをつける
    for curtitle in df1_list:
        wdf = df2.query('(title != @curtitle)')
        for index in wdf.index.values:
            df2.at[index, 'Flag'] = "Nothing"
    
[/code]


CC BY-SA 4.0
2022-06-16T10:40:01.483
89423
2022-06-16T11:46:49.773
2022-06-16T11:46:49.773
3060
53100
89421
answer


別の方法

[code]

    In [1]: import pandas as pd
       ...: import io
       ...: 
       ...: csv1, csv2 = '''
       ...: created_at,title,messageId,content
       ...: 2022-06-16T06:43:17.488Z,日本,2332528852,雨
       ...: ''', '''
       ...: created_at,title,messageId,content
       ...: 2022-06-16T02:28:37.323Z,アメリカ,2332528842,晴れ
       ...: 2022-06-16T02:28:37.323Z,スペイン,2332528843,
       ...: 2022-06-16T06:43:17.488Z,日本,2332528852,雨
       ...: 2022-06-16T02:28:37.323Z,カナダ,2332528853,
       ...: '''
       ...: df1, df2 = [pd.read_csv(io.StringIO(f.strip()), parse_dates=['created_at'])for f in (csv1, csv2)]
       ...: 
    
    In [2]: df1
    Out[2]: 
                            created_at title   messageId content
    0 2022-06-16 06:43:17.488000+00:00    日本  2332528852       雨
    
    In [3]: df2
    Out[3]: 
                            created_at title   messageId content
    0 2022-06-16 02:28:37.323000+00:00  アメリカ  2332528842      晴れ
    1 2022-06-16 02:28:37.323000+00:00  スペイン  2332528843     NaN
    2 2022-06-16 06:43:17.488000+00:00    日本  2332528852       雨
    3 2022-06-16 02:28:37.323000+00:00   カナダ  2332528853     NaN
    
    In [4]: df2['title'].isin('日本')
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]
    
    In [5]: df2['title'].isin(['日本'])
    Out[5]: 
    0    False
    1    False
    2     True
    3    False
    Name: title, dtype: bool
    
    In [6]: df2['title'].isin(['日本', 'スペイン'])
    Out[6]: 
    0    False
    1     True
    2     True
    3    False
    Name: title, dtype: bool
    
    In [7]: df2['title'].isin(df1['title'])
    Out[7]: 
    0    False
    1    False
    2     True
    3    False
    Name: title, dtype: bool
    
[/code]

ということで

[code]

    df2['Flag'] = 'Nothing'
    df2.loc[df2['title'].isin(df1['title']), 'Flag'] = ''
    
[/code]


CC BY-SA 4.0
2022-06-17T02:19:35.460
89440
2022-06-17T02:19:35.460
43025
89421
answer