【问题标题】:Groupby multiple columns but ignore orders and sum up other columns in PandasGroupby 多列但忽略订单并总结 Pandas 中的其他列
【发布时间】:2020-11-23 09:07:00
【问题描述】:

给定一个数据集如下:

   starting destination  numbers  time
0       BJS         SZX       18    14
1       BJS         SHA       25    12
2       CTU         KMG       23    43
3       HFE         HGH       15    18
4       HGH         HFE       17    41
5       KMG         CTU       32    55
6       SHA         BJS       25    12
7       SZX         BJS       18    14
8       TSN         BJS        9    21
9       AVA         HZH        9    17
10      BJS         SHA       31    52
11      HZH         AVA       31    63
12      SHA         BJS       28    33
13      TNA         WUS       17    27
14      WUS         TNA       17    95
15      BJS         SHA       11    37
16      JXA         LDS       11    28
17      LDS         JXA        0     0
18      SHA         BJS       17    36
19      BJS         SEA       25    30

我将startingdestination 组合为line by df['line'] = df[['starting', 'destination']].apply(lambda x: '-'.join(x), axis=1)

   starting destination  numbers  time     line
0       BJS         SZX       18    14  BJS-SZX
1       BJS         SHA       25    12  BJS-SHA
2       CTU         KMG       23    43  CTU-KMG
3       HFE         HGH       15    18  HFE-HGH
4       HGH         HFE       17    41  HGH-HFE
5       KMG         CTU       32    55  KMG-CTU
6       SHA         BJS       25    12  SHA-BJS
7       SZX         BJS       18    14  SZX-BJS
8       TSN         BJS        9    21  TSN-BJS
9       AVA         HZH        9    17  AVA-HZH
10      BJS         SHA       31    52  BJS-SHA
11      HZH         AVA       31    63  HZH-AVA
12      SHA         BJS       28    33  SHA-BJS
13      TNA         WUS       17    27  TNA-WUS
14      WUS         TNA       17    95  WUS-TNA
15      BJS         SHA       11    37  BJS-SHA
16      JXA         LDS       11    28  JXA-LDS
17      LDS         JXA        0     0  LDS-JXA
18      SHA         BJS       17    36  SHA-BJS
19      BJS         SEA       25    30  BJS-SEA

我需要对line 列进行分组,然后总结numberstime,但我们应该将BJS-SZXSZX-BJSBJS-SHASHA-BJS 等视为同一行。

df.groupby(['line'])['numbers', 'time'].apply(lambda x : x.astype(int).sum())

输出:

         numbers  time
line                  
AVA-HZH        9    17
BJS-SEA       25    30
BJS-SHA       67   101
BJS-SZX       18    14
CTU-KMG       23    43
HFE-HGH       15    18
HGH-HFE       17    41
HZH-AVA       31    63
JXA-LDS       11    28
KMG-CTU       32    55
LDS-JXA        0     0
SHA-BJS       70    81
SZX-BJS       18    14
TNA-WUS       17    27
TSN-BJS        9    21
WUS-TNA       17    95

我们怎么能做到这一点?谢谢。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    IIUC 你可以先在axis=1 上排序,然后再创建一行:

    df["line"] = ["-".join(i) for i in np.sort(df.iloc[:, :2].to_numpy(), axis=1)]
    
    print (df.groupby("line").sum())
    
             numbers  time
    line                  
    AVA-HZH       40    80
    BJS-SEA       25    30
    BJS-SHA      137   182
    BJS-SZX       36    28
    BJS-TSN        9    21
    CTU-KMG       55    98
    HFE-HGH       32    59
    JXA-LDS       11    28
    TNA-WUS       34   122
    

    【讨论】:

      【解决方案2】:

      参考here的替代解决方案:

      df[['starting', 'destination']] = np.sort(df[['starting', 'destination']], axis=1)
      df['line'] = df[['starting', 'destination']].apply(lambda x: '-'.join(x), axis=1)
      df.groupby('line')['numbers', 'time'].sum().reset_index()
      

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 2020-10-04
        • 2022-07-19
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 2017-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多