94588


以下のデータの宛先ポート番号を50-55、56-60といったようにレンジでグループ化し、元データを置換したい。

[code]

    csv_data = '''
    送信元IP,宛先IP,宛先ポート番号
    1.1.1.1,3.3.3.3,53
    1.1.1.2,3.3.3.3,57
    2.2.2.2,9.9.9.9,54
    2.2.2.3,9.9.9.9,59
    4.4.4.4,10.10.10.10,56
    20.20.20.20,30.30.30.30,60
    '''
    
[/code]

期待する出力結果

[code]

    output = '''
    送信元IP,宛先IP,宛先ポート番号
    1.1.1.1,3.3.3.3,50-55
    1.1.1.2,3.3.3.3,56-60
    2.2.2.2,9.9.9.9,50-55
    2.2.2.3,9.9.9.9,56-60
    4.4.4.4,10.10.10.10,56-60
    20.20.20.20,30.30.30.30,56-60
    '''
    
[/code]

### これまでに試したこと

以下のコードを実行しましたが、全ての宛先ポート番号が56−60のレンジになってしまいました。

[code]

    import io
    import pandas as pd
    df = pd.read_csv(io.StringIO(csv_data))
    
    df["宛先ポート番号"]=df["宛先ポート番号"].astype(str)
    df["宛先ポート番号"]=df.loc[(df["宛先ポート番号"]>="50") & (df["宛先ポート番号"]<="55"),"宛先ポート番号”]="50-55"
    df["宛先ポート番号"]=df.loc[(df["宛先ポート番号"]>="56") & (df["宛先ポート番号"]<="60"),"宛先ポート番号”]="56-60"
    
[/code]


CC BY-SA 4.0
2023-04-20T15:26:18.397
94587
2023-04-21T08:33:14.500
2023-04-20T16:24:29.427
3060
57568
question
python
範囲指定をして置換する方法について


[pandas.cut — pandas 2.0.0 documentation](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.cut.html) を使います。

[code]

    import pandas as pd
    import io
    
    csv_data = '''
    送信元IP,宛先IP,宛先ポート番号
    1.1.1.1,3.3.3.3,53
    1.1.1.2,3.3.3.3,57
    2.2.2.2,9.9.9.9,54
    2.2.2.3,9.9.9.9,59
    4.4.4.4,10.10.10.10,56
    20.20.20.20,30.30.30.30,60
    20.20.20.20,30.30.30.30,80
    '''
    df = pd.read_csv(io.StringIO(csv_data))
    
    #
    idx = df['宛先ポート番号'].between(50, 60)
    df.loc[idx, '宛先ポート番号'] = pd.cut(df.loc[idx, '宛先ポート番号'],
                                           [50, 55, 60], labels=['50-55', '56-60'])
    print(df)
    
    #       送信元IP       宛先IP 宛先ポート番号
    # 0      1.1.1.1      3.3.3.3          50-55
    # 1      1.1.1.2      3.3.3.3          56-60
    # 2      2.2.2.2      9.9.9.9          50-55
    # 3      2.2.2.3      9.9.9.9          56-60
    # 4      4.4.4.4  10.10.10.10          56-60
    # 5  20.20.20.20  30.30.30.30          56-60
    # 6  20.20.20.20  30.30.30.30             80
    
[/code]


CC BY-SA 4.0
2023-04-20T15:49:58.363
94588
2023-04-21T08:33:14.500
2023-04-21T08:33:14.500
47127
47127
94587
answer