89045


### やりたいこと

表1に `定刻[変更]` のように同じ列を含む行が複数あった場合、 **表2** のように1行にまとめたいです。

Pandasのgroupbyを使ってみましたが、実現したい結果と上手くいかないです。

コードでは何がいけないのか、もしくは他に簡単な方法がありましたら、教えていただけると嬉しいです。お手数ですが、よろしくお願い致します。

表1.csv

[code]

    定刻[変更],出発地,経由地,航空会社,便名,機種,ターミナル,運航状況
    00:15[ - ],マニラ,,フィリピン航空,PR0424,321,T3,欠航
    05:00[05:06],ロサンゼルス,,ANA,NH0105,77N,T3,到着済み
    05:00[05:06],ロサンゼルス,,ユナイテッド航空,UA7983,77N,T3,到着済み
    05:00[ - ],サンフランシスコ,,ANA,NH0107,78I,T3,欠航
    05:35[04:44],デリー,,ANA,NH0838,78I,T3,到着済み
    05:40[05:31],シドニー,,ANA,NH0880,78E,T3,到着済み
    05:40[05:31],シドニー,,ニュージーランド航空,NZ4158,78E,T3,到着済み
    05:50[05:26],バンコク（BKK）,,ANA,NH0850,78I,T3,到着済み
    05:50[05:26],バンコク（BKK）,,エア・カナダ,AC6272,78I,T3,到着済み
    05:50[05:26],バンコク（BKK）,,エチオピア航空,ET1403,78I,T3,到着済み
    05:50[05:26],バンコク（BKK）,,タイ国際航空,TG6107,78I,T3,到着済み
    06:10[05:42],バンコク（BKK）,,日本航空,JL0034,789,T3,到着済み
    06:10[05:42],バンコク（BKK）,,バンコクエアウェイズ,PG4153,789,T3,到着済み
    06:10[05:42],バンコク（BKK）,,スリランカ航空,UL3360,789,T3,到着済み
    06:10[05:42],バンコク（BKK）,,アメリカン航空,AA8465,789,T3,到着済み
    
    
[/code]

### 実現した処理の結果

今回は表2のように複数コードシェアがある場合、 `05:00[05:06],ロサンゼルス`
・`05:50[05:26],バンコク（BKK）`・`06:10[05:42],バンコク（BKK）`が重複しています。

**重複している場合、先頭行を見て`定刻[変更]` から `運航状況` までを1行でまとめたいです。**

**航空会社と便名は、カンマ区切りで同じように順番でソートさせたいです。**

[code]

    05:00[05:06],ロサンゼルス,,ANA ユナイテッド航空,NH0105,UA7983,77N,T3,到着済み
    
[/code]

[code]

    05:50[05:26],バンコク（BKK）,,"ANA,エア・カナダ,エチオピア航空,タイ国際航空","NH0850,AC6272,ET1403,TG6107",78I,T3,到着済み
    
[/code]

[code]

    06:10[05:42],バンコク（BKK）,,"日本航空,バンコクエアウェイズ,スリランカ航空,アメリカン航空","JL0034,PG4153,UL3360,AA8465",789,T3,到着済み
    
[/code]

表2.csv

[code]

    定刻[変更],出発地,経由地,航空会社,便名,機種,ターミナル,運航状況
    00:15[ - ],マニラ,,フィリピン航空,PR0424,321,T3,欠航
    05:00[05:06],ロサンゼルス,,ANA,NH0105,77N,T3,到着済み
    05:00[05:06],ロサンゼルス,,ユナイテッド航空,UA7983,77N,T3,到着済み
    05:00[ - ],サンフランシスコ,,ANA,NH0107,78I,T3,欠航
    05:35[04:44],デリー,,ANA,NH0838,78I,T3,到着済み
    05:40[05:31],シドニー,,ANA,NH0880,78E,T3,到着済み
    05:40[05:31],シドニー,,ニュージーランド航空,NZ4158,78E,T3,到着済み
    05:50[05:26],バンコク（BKK）,,"ANA,エア・カナダ,エチオピア航空,タイ国際航空","NH0850,AC6272,ET1403,TG6107",78I,T3,到着済み
    06:10[05:42],バンコク（BKK）,,"日本航空,バンコクエアウェイズ,スリランカ航空,アメリカン航空","JL0034,PG4153,UL3360,AA8465",789,T3,到着済み
    
    
    
[/code]

現在の `df_after` の結果は1行でまとめておりますが、上記のように実現したい処理にならないです。  
機種,ターミナル,運航状況の行などの行が重複されます。  
また、なぜか経由地のセルに `0.0` が入力されています。

[code]

    定刻[変更]
    00:15[ - ]                                     マニラ  0.0                       フィリピン航空                    PR0424           321        T3                欠航
    05:00[ - ]                                サンフランシスコ  0.0                           ANA                    NH0107           78I        T3                欠航
    05:00[05:06]                          ロサンゼルスロサンゼルス  0.0                   ANAユナイテッド航空              NH0105UA7983        77N77N      T3T3          到着済み到
    着済み
    05:35[04:44]                                   デリー  0.0                           ANA                    NH0838           78I        T3              到着済み
    05:40[05:31]                              シドニーシドニー  0.0                 ANAニュージーランド航空              NH0880NZ4158        78E78E      T3T3          到着済み到着
    済み
    05:50[05:26]  バンコク（BKK）バンコク（BKK）バンコク（BKK）バンコク（BKK）  0.0        ANAエア・カナダエチオピア航空タイ国際航空  NH0850AC6272ET1403TG6107  78I78I78I78I  T3T3T3T3  到着済み到着済み到着済み到着済み
    06:10[05:42]  バンコク（BKK）バンコク（BKK）バンコク（BKK）バンコク（BKK）  0.0  日本航空バンコクエアウェイズスリランカ航空アメリカン航空  JL0034PG4153UL3360AA8465  789789789789  T3T3T3T3  到着済み到着済み到着済み到着済み>
    
[/code]

コード

[code]

    import pandas as pd
    
    #ファイル読み込み
    df = pd.read_csv(r"test.csv")
    print(df)
    
    # #データフレーム
    # df = pd.DataFrame(df1)
    # print(df)
    
    #参考ページ
    #https://qiita.com/propella/items/a9a32b878c77222630ae
    # a=df.groupby(['定刻[変更]','出発地','経由地','航空会社','便名','機種']).mean()
    # print(a)
    
    #After
    df_after = df.groupby('定刻[変更]').apply(lambda x: x.sum()).drop('定刻[変更]',axis=1).reset_index()
    print(df_after)
    
[/code]

回答後のプログラく


CC BY-SA 4.0
2022-05-25T01:50:12.547
89033
2022-05-25T09:09:06.340
2022-05-25T07:17:37.830
18859
18859
question
python python3 pandas
Pandasでgroupbyを使って重複した値を1行でまとめたい


「pandas groupby 文字列」などで検索し以下のサイトを参考に作成しました。

[python – pandas groupbyで文字列をリスト化](https://www.polka-dot.net/python-pandas-
groupby%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%83%AA%E3%82%B9%E3%83%88%E5%8C%96/)

[code]

    import pandas as pd
    
    #ファイル読み込み
    df = pd.read_csv(r"test.csv")
    
    df_after = df.groupby('定刻[変更]').agg(lambda x: ','.join(sorted(set(list(x))))).reset_index()
    
     print(df_after)
    
[/code]

listになっているところにset()を挟んで重複排除しています。  
しかし、2点の問題が発生しました。

・groupby出来ない列が勝手に削除される。(nanのみの列や、数字と文字が混ざる列)  
・上記列削除の際に、Warningが発生する。

それを素人ながら、無理やり改善したコードがこちらです。

[code]

    import pandas as pd
    
    #ファイル読み込み
    df = pd.read_csv(r"test.csv")
    
    # df加工
    df = df.fillna('')  # nanを''に置き換え
    df['機種'] = df['機種'].astype(str)  # intとstrが混ざる列をstrに統一
    
    def rm_null(tup):
        # ['', 'hoge'] の''を除外
        ls = list(tup)
        if ls != ['',]:
            ls = [a for a in ls if a != '']
        return ls
    
    df_after = df.groupby('定刻[変更]').agg(lambda x: ','.join(sorted(rm_null(set(list(x)))))).reset_index()
    print(df_after)
    
[/code]

nanを無理やり''に置き換えています。  
また機種列の要素を全てstr型に変換しています。  
''が混ざると「'',サンフランシスコ」のようなデータになってしまうので、rm_null()関数を作成し、無理やり排除しました。  
最終結果として、nanが''になっている問題が残っています。

私も力不足で申し訳ないです。


CC BY-SA 4.0
2022-05-25T06:36:31.703
89041
2022-05-25T06:49:51.580
2022-05-25T06:49:51.580
52019
52019
89033
answer

[code]

    dfx = df.drop_duplicates(subset='定刻[変更]').fillna('').set_index('定刻[変更]')
    dfx[['航空会社', '便名']] = df.groupby('定刻[変更]')[['航空会社', '便名']].agg(','.join)
    dfx.reset_index(inplace=True)
    
    print(dfx.to_markdown(index=False))
    
[/code]

定刻[変更] | 出発地 | 経由地 | 航空会社 | 便名 | 機種 | ターミナル | 運航状況  
---|---|---|---|---|---|---|---  
00:15[ - ] | マニラ |  | フィリピン航空 | PR0424 | 321 | T3 | 欠航  
05:00[05:06] | ロサンゼルス |  | ANA,ユナイテッド航空 | NH0105,UA7983 | 77N | T3 | 到着済み  
05:00[ - ] | サンフランシスコ |  | ANA | NH0107 | 78I | T3 | 欠航  
05:35[04:44] | デリー |  | ANA | NH0838 | 78I | T3 | 到着済み  
05:40[05:31] | シドニー |  | ANA,ニュージーランド航空 | NH0880,NZ4158 | 78E | T3 | 到着済み  
05:50[05:26] | バンコク（BKK） |  | ANA,エア・カナダ,エチオピア航空,タイ国際航空 |
NH0850,AC6272,ET1403,TG6107 | 78I | T3 | 到着済み  
06:10[05:42] | バンコク（BKK） |  | 日本航空,バンコクエアウェイズ,スリランカ航空,アメリカン航空 |
JL0034,PG4153,UL3360,AA8465 | 789 | T3 | 到着済み


CC BY-SA 4.0
2022-05-25T08:43:31.400
89045
2022-05-25T09:09:06.340
2022-05-25T09:09:06.340
47127
47127
89033
answer