在Pandas中旋转一个groupby对象?

时间:2016-08-03 05:49:13

标签: python pandas

我有以下数据框:

df = pd.DataFrame([
        [123, 'abc', '121'],
        [124, 'abc', '121'],
        [456, 'def', '121'],
        [123, 'abc', '122'],
        [123, 'abc', '122'],
        [456, 'def', '145'],
        [456, 'def', '145'],
        [456, 'def', '146'],
    ], columns=['userid', 'name', 'dt'])

我根据日期对其进行了分组: df2 = df.groupby('dt').apply(lambda df: df.reset_index(drop=True))

现在,数据框如下所示: enter image description here

现在,我想调整上面的内容,使它们采用以下格式: userid name_1, name_2, ..., name_k为每个组,使得结束df看起来像这样:

userid   name
123      abc
124      abc
456      def
123      abc, abc

2 个答案:

答案 0 :(得分:2)

您可以将cumcountpivot_table一起使用,其中参数索引使用列useriddt,因此看起来不需要创建df2:< / p>

df['cols'] = 'name_' + (df.groupby(['userid','dt']).cumcount() + 1).astype(str)

print (df.pivot_table(index=['userid', 'dt'],columns='cols', values='name', aggfunc=''.join))
cols       name_1 name_2
userid dt               
123    121    abc   None
       122    abc    abc
124    121    abc   None
456    121    def   None
       145    def    def
       146    def   None

答案 1 :(得分:2)

结帐groupbyapply。他们各自的文档是herehere。您可以unstackdocs)创建MultiIndex的额外级别。

df = df.set_index(['userid', 'dt'])['name']
df = df.groupby(level=[0,1]).apply(
    lambda st: pd.Series(st.values, index=['name_%i'%i for i in range(st.shape[0])])
).unstack(level=-1)
print(df)

输出

           name_0 name_1
userid dt               
123    121    abc   None
       122    abc    abc
124    121    abc   None
456    121    def   None
       145    def    def
       146    def   None