
[code]

      file_name  expression
    0   test_0000.jpg   1
    1   test_0001.jpg   0
    2   test_0002.jpg   0
    3   test_0003.jpg   0
    4   test_0004.jpg   2
    ... ... ...
    307  test_0307.jpg  1
    308  test_0308.jpg  0
    309  test_0309.jpg  1
    310  test_0310.jpg  3
    311 test_0311.jpg   1
    
[/code]

このdataframeの `expression` 行の数値を

`0`⇒`neutral`  
`1`⇒`happy`  
`2`⇒`sad`  
`3`⇒`angry`  
に変換したく、下記のコードを実装させたのですが

[code]

    Submit['expression'].replace({'0':'neutral', '1':'happy', '2':'sad', '3':'angry'})
    
[/code]

このエラーが発生してしまいました。

[code]

    TypeError: Cannot compare types 'ndarray(dtype=uint8)' and 'str'
    
[/code]

以下の事を試しましたが、

1\. replace時にstrに変換

[code]

    Submit['expression'].replace(str.maketrans({'0':'neutral', '1':'happy', '2':'sad', '3':'angry'}))
    
[/code]

2\. dataframe作成時に数値の行を文字列に変換

[code]

    Submit1 = Submit['expression'].astype(str)
    
[/code]

エラーになってしまい変換することが出来ませんでした。

このエラーに対してのアドバイスを頂けたら幸いです。  
よろしくお願い致します。


CC BY-SA 4.0
2021-03-08T09:26:35.183
74518
2022-10-13T10:07:15.830
2021-03-08T11:42:39.360
40847
question
python pandas
dataframe内の数値から文字列に変換する方法


変換用辞書を数値のキーにする方法と, 文字列のまま使用する方法を行いました  
どちらも利用可能です

[code]

    import pandas as pd
    
    df = pd.DataFrame([
      ['test_0000.jpg', 1],
      ['test_0001.jpg', 0],
      ['test_0002.jpg', 0],
      ['test_0003.jpg', 0],
      ['test_0004.jpg', 2]], columns=['file_name','expression'])
    
    dct_int = {0: 'neutral', 1: 'happy', 2: 'sad', 3: 'angry'}
    dct_str = {'0': 'neutral', '1': 'happy', '2': 'sad', '3': 'angry'}
    
    df['exp_name'] = df['expression'].replace(dct_int)
    df['exp_name2'] = df['expression'].astype(str).replace(dct_str)
    display(df)
    
[/code]

* * *

試したこと (1) では `replace` に与える辞書としては不適当で, 変換に失敗するでしょう。  
試したこと (2) では, 何が失敗したのか不明です


CC BY-SA 4.0
2021-03-08T11:27:35.123
74522
2021-03-08T11:27:35.123
43025
74518
answer


dfは下記のDataFrameとする。

[code]

        file_name   expression
    0   test_0000.jpg   1
    1   test_0001.jpg   0
    2   test_0002.jpg   0
    3   test_0003.jpg   0
    4   test_0004.jpg   2
    5   test_0307.jpg   1
    6   test_0308.jpg   0
    7   test_0309.jpg   1
    8   test_0310.jpg   3
    9   test_0311.jpg   1
    
[/code]

expression列の型を変換してから置換すれば良いでしょう。

[code]

    df['expression'] = df['expression'].astype(str)
    df['expression'] = df['expression'].replace({'0':'neutral', '1':'happy', '2':'sad', '3':'angry'})
    print(df)
    #   file_name   expression
    #0  test_0000.jpg   happy
    #1  test_0001.jpg   neutral
    #2  test_0002.jpg   neutral
    #3  test_0003.jpg   neutral
    #4  test_0004.jpg   sad
    #5  test_0307.jpg   happy
    #6  test_0308.jpg   neutral
    #7  test_0309.jpg   happy
    #8  test_0310.jpg   angry
    #9  test_0311.jpg   happy
    
[/code]


CC BY-SA 4.0
2021-03-08T11:29:56.850
74523
2021-03-08T11:29:56.850
39819
74518
answer