Skip to main content
 首页 » 编程设计

python之Pandas :groupby 相邻的相同元素

2025年05月04日17落叶

我需要根据数据框分组

df = pd.DataFrame({'id': [111, 111, 111, 111, 111, 222, 222], 'domain': ['vk.com', 'facebook.com', 'facebook.com', 'twitter.com', 'vk.com', 'facebook.com', 'twitter.com'], 'time': ['2017-01-12', '2017-01-12', '2017-01-12', '2017-01-13', '2017-01-12', '2017-01-14', '2017-01-14'], 'duration': [10, 20, 5, 12, 34, 12, 4]}) 

我用

df.groupby([df.id, df.domain]).agg({'duration':'sum', 'time': 'first'}).reset_index().reindex(columns=df.columns) 

得到

         domain  duration   id        time 
0  facebook.com        25  111  2017-01-12 
1   twitter.com        12  111  2017-01-13 
2        vk.com        44  111  2017-01-12 
3  facebook.com        12  222  2017-01-14 
4   twitter.com         4  222  2017-01-14 

但期望输出是:

         domain  duration   id        time 
         vk.com        10  111  2017-01-12 
   facebook.com        25  111  2017-01-12 
         vk.com        34  111  2017-01-12 
    twitter.com        12  111  2017-01-13 
   facebook.com        12  222  2017-01-14 
    twitter.com         4  222  2017-01-14 

我该如何解决?

请您参考如下方法:

这是一个没有额外列的替代方案 -

i = df.domain.ne(df.domain.shift()).cumsum() 
m = dict(zip(i, df.domain)) 
 
df = df.groupby(['id', i], sort=False)\ 
       .agg({'duration':'sum', 'time': 'first'})\ 
       .reset_index() 
df.domain = df.domain.map(m) 
 
df 
 
    id        domain        time  duration 
0  111        vk.com  2017-01-12        10 
1  111  facebook.com  2017-01-12        25 
2  111   twitter.com  2017-01-13        12 
3  111        vk.com  2017-01-12        34 
4  222  facebook.com  2017-01-14        12 
5  222   twitter.com  2017-01-14         4