94624


以下のデータで送信元IP,宛先ポート,TCP/UDPが同じである場合はグループ化し、グループ後のデータ件数を表示させたい。

[code]

    csv_data = '''
    送信元IP,宛先IP,宛先ポート,TCP/UDP,送信セグメント,宛先セグメント
    1.1.1.1,7.7.7.7,80,TCP,大阪,京都
    3.3.3.3,7.7.7.8,15000,UDP,京都,大阪
    4.4.4.4,7.7.7.9,18000,UDP,東京,京都
    1.1.1.1,7.7.7.3,80,TCP,大阪,福岡
    6.6.6.6,7.7.7.4,22,TCP,福岡,千葉
    1.1.1.1,7.7.7.5,80,UDP,東京,大阪
    '''
    
[/code]

期待する出力結果

[code]

    output = '''
    データ件数,送信元IP,宛先IP,宛先ポート,TCP/UDP,送信セグメント,宛先セグメント
    1,1.1.1.1,7.7.7.7,80,TCP,大阪,京都
    1,1.1.1.1,7.7.7.3,80,TCP,大阪,福岡
    2,1.1.1.1,7.7.7.5,80,UDP,東京,大阪
    3,3.3.3.3,7.7.7.8,15000,UDP,京都,大阪
    4,4.4.4.4,7.7.7.9,18000,UDP,東京,京都
    5,6.6.6.6,7.7.7.4,22,TCP,福岡,千葉
    '''
    
[/code]

これまでに試したこと  
以下のコードを実行しましたが、宛先IP、送信セグメント、宛先セグメントが結合されて表示されてしまいます。

[code]

    import io
    import pandas as pd
    
    df=pd.read_csv(io.StringIO(csv_data))
    df2=df.groupby(["送信元IP","宛先ポート","TCP/UDP"],as_index=True)["宛先IP","セグメント","宛先セグメント"].sum().reset_index()
    
[/code]

データの件数に関しては、グループ化した結果のdf2をto_excelでエクセルに出力してからマニュアルで作成していますが、エクセルに出力する前にデータ件数を作成できる方法などございましたら、ご教示ください。


CC BY-SA 4.0
2023-04-23T07:06:41.600
94623
2023-04-25T00:31:49.900
2023-04-25T00:31:49.900
3060
57568
question
python
データのグループ化について


> グループ後のデータ件数

グループ毎のデータ件数を集計すると以下の様な結果になりますが、提示されている「期待する処理結果」とは異なります。もしかして、「データ件数」ではなく「グループ番号」ではないでしょうか？

[code]

    cols = ['送信元IP', '宛先ポート', 'TCP/UDP']
    df = df.sort_values(cols)
    df.insert(loc = 0, column = 'データ件数',
              value = df.groupby(cols)[cols[0]].transform('count'))
    
    print(df)
    
[/code]

データ件数 | 送信元IP | 宛先IP | 宛先ポート | TCP/UDP | 送信セグメント | 宛先セグメント  
---|---|---|---|---|---|---  
2 | 1.1.1.1 | 7.7.7.7 | 80 | TCP | 大阪 | 京都  
2 | 1.1.1.1 | 7.7.7.3 | 80 | TCP | 大阪 | 福岡  
1 | 1.1.1.1 | 7.7.7.5 | 80 | UDP | 東京 | 大阪  
1 | 3.3.3.3 | 7.7.7.8 | 15000 | UDP | 京都 | 大阪  
1 | 4.4.4.4 | 7.7.7.9 | 18000 | UDP | 東京 | 京都  
1 | 6.6.6.6 | 7.7.7.4 | 22 | TCP | 福岡 | 千葉  
  
**追記**

「データ件数」ではなく「グループ番号」の場合は以下の様にします。

[code]

    cols = ['送信元IP', '宛先ポート', 'TCP/UDP']
    df = df.sort_values(cols).reset_index(drop=True)
    df.insert(loc=0, column='グループ番号', value=df.groupby(cols).ngroup()+1)
    
    print(df)
    
[/code]

グループ番号 | 送信元IP | 宛先IP | 宛先ポート | TCP/UDP | 送信セグメント | 宛先セグメント  
---|---|---|---|---|---|---  
1 | 1.1.1.1 | 7.7.7.7 | 80 | TCP | 大阪 | 京都  
1 | 1.1.1.1 | 7.7.7.3 | 80 | TCP | 大阪 | 福岡  
2 | 1.1.1.1 | 7.7.7.5 | 80 | UDP | 東京 | 大阪  
3 | 3.3.3.3 | 7.7.7.8 | 15000 | UDP | 京都 | 大阪  
4 | 4.4.4.4 | 7.7.7.9 | 18000 | UDP | 東京 | 京都  
5 | 6.6.6.6 | 7.7.7.4 | 22 | TCP | 福岡 | 千葉


CC BY-SA 4.0
2023-04-23T08:55:34.793
94624
2023-04-23T09:28:52.830
2023-04-23T09:28:52.830
47127
47127
94623
answer