熊猫分组并保留另一列的值

时间:2020-04-08 04:55:27

标签: python pandas pandas-groupby

我有一个看起来像这样的数据框

Site  Sector  Model  Frequency  Bandwidth
A       1     abc      900        500M
A       2     abc      900        1000M
A       3     abc      900        1000M
A       1     abc      1000       2000M
A       2     abc      1000       3000M
A       3     abc      1000       3000M
B       1     def      900        150M
B       2     def      900        220M
B       3     def      900        300M
B       1     def      1000       450M
B       2     def      1000       600M
B       3     def      1000       1000M

并且我已经使用groupby和agg函数连接了FrequencyBandwidth

grouped_df = ndb_df.groupby(by=['Site', 'Sector'], as_index=False).agg({'Frequency': lambda x: '#'.join(x.astype(str)), 'Bandwidth': lambda y: '#'.join(y.astype(str))})

这将导致以下数据帧输出

Site  Sector  Frequency  Bandwidth
A       1     900#1000    500M#2000M
A       2     900#1000    1000M#3000M
A       3     900#1000    1000M#3000M
B       1     900#1000    150M#450M
B       2     900#1000    220M#600M
B       3     900#1000    300M#1000M

输出grouped_df删除了我希望保留的列Model。有什么想法吗?

我真正想要的

Site  Sector  Model  Frequency  Bandwidth
A       1     abc    900#1000    500M#2000M
A       2     abc    900#1000    1000M#3000M
A       3     abc    900#1000    1000M#3000M
B       1     def    900#1000    150M#450M
B       2     def    900#1000    220M#600M
B       3     def    900#1000    300M#1000M

1 个答案:

答案 0 :(得分:1)

第一个想法是,如果Model之类的组相同,则将by列添加到Site参数中。

grouped_df = (ndb_df.groupby(by=['Site', 'Sector', 'Model'], as_index=False)
                    .agg({'Frequency': lambda x: '#'.join(x.astype(str)), 
                         'Bandwidth': lambda y: '#'.join(y.astype(str))})

或使用GroupBy.first函数将此列添加到字典:

grouped_df = (ndb_df.groupby(by=['Site', 'Sector'], as_index=False)
                     .agg({'Model':'first',
                           'Frequency': lambda x: '#'.join(x.astype(str)), 
                            'Bandwidth': lambda y: '#'.join(y.astype(str))
                           }))
print (grouped_df)
  Site  Sector Model Frequency    Bandwidth
0    A       1   abc  900#1000   500M#2000M
1    A       2   abc  900#1000  1000M#3000M
2    A       3   abc  900#1000  1000M#3000M
3    B       1   def  900#1000    150M#450M
4    B       2   def  900#1000    220M#600M
5    B       3   def  900#1000   300M#1000M

也可以将lambda函数分配给变量,例如:

f = lambda x: '#'.join(x.astype(str))
grouped_df = (ndb_df.groupby(by=['Site', 'Sector'], as_index=False)
                     .agg({'Model':'first',
                           'Frequency': f, 
                            'Bandwidth': f})
              )