

先日、[pandas
別のデータフレームから参照して置換する方法](https://ja.stackoverflow.com/questions/66396/pandas-%e5%88%a5%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%83%95%e3%83%ac%e3%83%bc%e3%83%a0%e3%81%8b%e3%82%89%e5%8f%82%e7%85%a7%e3%81%97%e3%81%a6%e7%bd%ae%e6%8f%9b%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95)を質問した者です。  
上記は解決したのですが、下記のデータフレームで参照する方法が上手くいきません。  
[例]  
[df2]を参照して、'City'に対応するCityCodeを[df1]に追加したい

[code]

    import pandas as pd
    
    df1 = pd.DataFrame({
        'Name': ['John', 'Milke', 'Saya', 'Taro'],
        'Residence': ['Osaka', 'Kyoto', 'Nagoya', 'Kyoto']
    })
    
    df2 = pd.DataFrame({
        'City': ['Osaka', 'Kyoto', 'Fukuoka', 'Nagoya'],
        'CityId': [1001, 1002, 1003, 1004]
    })
    
[/code]

[求めたい結果]

[code]

    [df1]
    Name, Residence, CityId
    John, Osaka, 1001
    Mike, Kyoto, 1002
    Saya, Nagoya, 1004
    Taro, Kyoto, 1002
    
[/code]

[試した方法]  
mapメソッドのほかに、isinメソッドを試してみました。

[code]

    #初めにdf1に'CityCode'を追加し0を代入しておく
    df1['CityCode'] = 0
    
    df1['CityCode'] = df2[df2['CityCode'].isin(df1['Residence'])]
    
[/code]

[結果のエラー]

[code]

    KeyError: 'CityCode'
    
    During handling of the above exception, another exception occurred:
    
[/code]

まだpandasに対する理解があまりできておらず、初歩的な質問で申し訳ないのですが、ぜひご教授お願い致します。


CC BY-SA 4.0
2020-05-10T02:49:20.760
66476
2020-05-10T05:32:43.767
40042
question
python pandas
pandas リストデータフレームから参照して列を追加したい


以下、`pandas.Series.map + pandas.DataFrame.assign` と `pandas.DataFrame.merge`
を使う方法を示します。

**[pandas.Series.map](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.map.html) \+
[pandas.DataFrame.assign](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.assign.html)**

[code]

    >>> df1 = df1.assign(CityId = df1.Residence.map(df2.set_index('City').CityId))
    >>> df1
        Name Residence  CityId
    0   John     Osaka    1001
    1  Milke     Kyoto    1002
    2   Saya    Nagoya    1004
    3   Taro     Kyoto    1002
    
[/code]

**[pandas.DataFrame.merge](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.merge.html)**

[code]

    >>> df1 = pd.merge(df1, df2, left_on='Residence', right_on='City', how='left').drop(columns='City')
    >>> df1
        Name Residence  CityId
    0   John     Osaka    1001
    1  Milke     Kyoto    1002
    2   Saya    Nagoya    1004
    3   Taro     Kyoto    1002
    
[/code]


CC BY-SA 4.0
2020-05-10T05:32:43.767
66477
2020-05-10T05:32:43.767
66476
answer