66398


プログラミング初学者です。  
pandasでのデータフレームに関しての質問です。  
2つのデータフレームで要素が一致したら置換する方法で苦戦しております。

[例]

[code]

    [df1]
    id, fruits
    1, ringo
    2, mikan
    3, suika
    
    [df2]
    id, fruits_en, fruits_jp
    1, apple, ringo
    2, watermelon, suika
    3, peach, momo
    4, orange, mikan
    
[/code]

[df2]を参照して、[df1]'fruits'を[df2]'fruits_en'要素へ置換したいのです。  
以下、期待する結果

[code]

    [df1]
    id, fruits
    1, apple
    2, orange
    3, watermelon
    
[/code]

[試した方法]  
`df.loc()`を用いた要素抽出から以下試みました。

[code]

    df1.loc[df1['fruits'] == df2['fruits_jp'], 'fruits'] = df2['fruits_en']
    
[/code]

結果、以下のようにエラーを返されてしまいました。

[code]

    ValueError: Can only compare identically-labeled Series objects
    
[/code]

上記例のように、別のデータフレームの列要素に一致した場合に置換する方法をご教授いただけませんでしょうか。よろしくお願いします。


CC BY-SA 4.0
2020-05-07T13:16:06.847
66396
2020-05-08T10:25:11.503
40042
question
python pandas
pandas 別のデータフレームから参照して置換する方法


以下は [pandas.Series.map](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.map.html) を使う方法です。

[code]

    import pandas as pd
    
    df1 = pd.DataFrame({
      'id': [1, 2, 3],
      'fruits': ['ringo', 'mikan', 'suika']
    })
    
    df2 = pd.DataFrame({
      'id': [1, 2, 3, 4],
      'fruits_en': ['apple', 'watermelon', 'peach', 'orange'],
      'fruits_jp': ['ringo', 'suika', 'momo', 'mikan']
    })
    
    df1.fruits = df1.fruits.map(df2.set_index('fruits_jp').fruits_en)
    
    print(df1)
    
       id      fruits
    0   1       apple
    1   2      orange
    2   3  watermelon
    
[/code]

**追記**

> mapメソッドのほかにreplaceというものも見つけたのですが、明確な違いは何かありますでしょうか。

[pandas.Series.replace](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.replace.html) を使う場合は以下の様になります。

[code]

    df1.fruits = df1.fruits.replace(df2.fruits_jp.to_list(), df2.fruits_en)
    
[/code]

ここで、例えば `df2` の中身が以下の様になっているとします。

[code]

    df2 = pd.DataFrame({
      'id': [1, 2, 3, 4, 5],
      'fruits_en': ['apple', 'watermelon', 'peach', 'orange', 'delicious'],
      'fruits_jp': ['ringo', 'suika', 'momo', 'mikan', 'ringo']
    })
    
[/code]

`fruits_jp` の要素に重複(`ringo`)があり、`ringo` に対する `fruits_en` の要素は `apple` と
`delicious` になっています。

[code]

    >>> df1.fruits.replace(df2.fruits_jp.to_list(), df2.fruits_en)
    0     delicious
    1        orange
    2    watermelon
    
[/code]

`replace` の場合は最後の対応要素に置換されますが、`map` ではエラーになってしまいます。原因は
`df2.set_index('fruits_jp')` としているためです。

[code]

    >>> df1.fruits.map(df2.set_index('fruits_jp').fruits_en)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.8/dist-packages/pandas/core/series.py", line 3630, in map
        new_values = super()._map_values(arg, na_action=na_action)
      File "/usr/local/lib/python3.8/dist-packages/pandas/core/base.py", line 1121, in _map_values
        indexer = mapper.index.get_indexer(values)
      File "/usr/local/lib/python3.8/dist-packages/pandas/core/indexes/base.py", line 2733, in get_indexer
        raise InvalidIndexError(
    pandas.core.indexes.base.InvalidIndexError: Reindexing only valid with uniquely valued Index objects
    
[/code]


CC BY-SA 4.0
2020-05-07T13:41:56.343
66398
2020-05-08T10:25:11.503
2020-05-08T10:25:11.503
66396
answer