熊猫:按相邻的相同元素分组

彼得·彼得罗夫

我需要按数据框分组

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

我该如何解决?

cs95

这是不带额外列的替代方法-

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章