熊猫:由相邻的相同元素组成

时间:2017-12-25 07:20:54

标签: python pandas

我需要groupby dataframe

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

我该如何解决?

2 个答案:

答案 0 :(得分:3)

我们可以使用一个额外的列来表示下一个域等于当前域

df['new'] = (df.domain == df.domain.shift(-1)).cumsum()

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

          .sort_values('id').reindex(columns=df.columns).drop(['new'],1)

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

答案 1 :(得分:3)

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

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