

画像のような売上データに対し、「評価」というカラムを追加して、「A,B,C」の評価をしたいと考えています。

[code]

    for index, id in enumerate(data['ID'].unique()):
        sm_data = data[data['ID'] == id]
    
    "カラムを作成"
        sm_data['評価'] = 'A'
    
        result = list(sm_data["売上"])
    
        for i in result:
        
        if i < 20000:
            sm_data['評価'].append('A')
        
        elif i < 8000:
            sm_data['評価'].append('C')
            
        else: sm_data['評価'].append('B')
    
[/code]

エラーコードで下記のように表示されます。

[code]

    TypeError: cannot concatenate object of type '<class 'str'>'; only Series and DataFrame objs are valid
    
[/code]

どのようにすれば、追加したカラムに評価を加えることができますでしょうか。  
よろしくお願いいたします。

**売上データ**

[![売上データ](https://i.stack.imgur.com/H6qfc.png)](https://i.stack.imgur.com/H6qfc.png)


CC BY-SA 4.0
2020-10-12T11:56:27.740
71137
2020-10-12T13:08:14.990
2020-10-12T12:18:51.673
3060
42209
question
python csv
データフレームに新しいカラムを追加し、計算をおこないたいです


`Series`に存在しない`append()`を呼び出しているのでエラーになっています。

条件付きで「評価」列の値を更新する場合は、以下のようにします（他にも方法はありますが）。

[code]

    sm_data.loc[sm_data["売上"] < 8000, '評価'] = 'C'
    
[/code]

それから、if分がおかしいです。

[code]

        if i < 20000:
            sm_data['評価'].append('A')
        
        elif i < 8000:
    
[/code]

これでは8000より小さい値でも最初のif文内に入るので、`A`になります。

追記：「売り上げが20000を超えたら」という条件であれば、以下の3行で十分です。

[code]

    sm_data['評価'] = 'B'
    sm_data.loc[sm_data["売上"] > 20000, '評価'] = 'A'
    sm_data.loc[sm_data["売上"] < 8000, '評価'] = 'C'
    
[/code]


CC BY-SA 4.0
2020-10-12T12:56:18.030
71139
2020-10-12T13:08:14.990
2020-10-12T13:08:14.990
21092
21092
71137
answer


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

[code]

    import pandas as pd
    
    df = pd.DataFrame({
      'ID': [10, 10, 10, 10, 10, 20, 20, 20, 20, 20],
      'name': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
      '月': ['2017/1/1', '2017/2/1', '2017/3/1', '2017/4/1', '2017/5/1',
             '2017/1/1', '2017/2/1', '2017/3/1', '2017/4/1', '2017/5/1'],
      '売上': [9786, 8464, 20291, 13130, 33974, 6459, 5586, 13392, 8666, 22423],
    }) 
    
    df['評価'] = df['売上'].map(
                   lambda x: 'A' if x > 20000 else ('C' if x < 8000 else 'B'))
    
    pd.set_option('display.unicode.east_asian_width', True)
    print(df)
    
    =>
       ID name        月    売上  評価
    0  10    A  2017/1/1   9786    B
    1  10    A  2017/2/1   8464    B
    2  10    A  2017/3/1  20291    A
    3  10    A  2017/4/1  13130    B
    4  10    A  2017/5/1  33974    A
    5  20    B  2017/1/1   6459    C
    6  20    B  2017/2/1   5586    C
    7  20    B  2017/3/1  13392    B
    8  20    B  2017/4/1   8666    B
    9  20    B  2017/5/1  22423    A
    
[/code]


CC BY-SA 4.0
2020-10-12T13:07:48.023
71140
2020-10-12T13:07:48.023
71137
answer