【问题标题】:How to glue elements into a list when using groupby function?使用 groupby 函数时如何将元素粘合到列表中?
【发布时间】:2014-08-21 01:36:07
【问题描述】:

我有一个数据框:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'C' : np.asarray([1,2,3,4,5,6,7,8])
                   'D' : np.asarray([2,3,4,5,6,7,8,9])})

     A   C   D
 0  foo  1   2
 1  bar  2   3
 2  foo  3   4
 3  bar  4   5
 4  foo  5   6
 5  bar  6   7
 6  foo  7   8
 7  foo  8   9

我想要的是

    A   C                  D
 0 foo  [1,3,5,7,8]      [2,4,6,8,9]
 1 bar  [2,4,6]          [3,5,7]

我自己写了一些东西,但它不起作用。它给了我原来的DataFrame:

def my_func(df):
    df.apply(lambda x: list(x.values), axis=0)
    return df

df = df.groupby(['A']).apply(my_func)
print df

如何实现我想要的功能?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这样就可以了,使用.agg():

    In [15]:
    
    df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                       'C' : np.asarray([1,2,3,4,5,6,7,8]),
                       'D' : np.asarray([2,3,4,5,6,7,8,9])})
    In [16]:
    
    print df.groupby('A').agg(lambda x: list(x))
                       C                D
    A                                    
    bar        [2, 4, 6]        [3, 5, 7]
    foo  [1, 3, 5, 7, 8]  [2, 4, 6, 8, 9]
    

    我认为df.groupby('A').C.agg(list) 也应该可以工作。但显然不会。

    如果你想使用apply,可以这样做,但是你会丢失列名:

    In [35]:
    
    print df.groupby('A').apply(lambda x: pd.Series(list(x.T.values)))
                                 0                1                2
    A                                                               
    bar            [bar, bar, bar]        [2, 4, 6]        [3, 5, 7]
    foo  [foo, foo, foo, foo, foo]  [1, 3, 5, 7, 8]  [2, 4, 6, 8, 9]
    

    将结果转换成Series很关键,否则你会得到:

    In [36]:
    
    print df.groupby('A').apply(lambda x: list(x.T.values))
    A
    bar              [[bar, bar, bar], [2, 4, 6], [3, 5, 7]]
    foo    [[foo, foo, foo, foo, foo], [1, 3, 5, 7, 8], [...
    dtype: object
    

    【讨论】:

    • 感谢您的回答。实际上,我有不止一列要聚合 4。
    • 你试过df.groupby('A').agg(lambda x: list(x))
    • 它有效,谢谢。如果你能告诉我我那段看起来很无辜的代码有什么问题,那就太好了:)
    • 查看编辑,如果你想使用apply,可以这样做,但你会丢失列名。基本上apply 函数应该返回一个长度为 3 的Series,比较两个新的编辑。
    • 似乎很生气 df.groupby('A').agg(list) 不起作用,我记得有一些 ~~argument~~ 讨论 agg 应该与列表一起使用...我认为现在好一点了。
    【解决方案2】:

    一个简单的方法是

    df = df.set_index('A')
    a = df.groupby(level=0).apply(lambda x: x['C'].values)
    

    a 现在看起来像这样

    A
    bar          [2, 4, 6]
    foo    [1, 3, 5, 7, 8]
    

    你可以通过

    访问元素
    a['bar']
    Out[235]: array([2, 4, 6])
    

    【讨论】:

    • 非常感谢。除了 'C' 之外,我还有不止一列,这就是我定义 my_func 的原因
    猜你喜欢
    • 2018-09-04
    • 2014-10-15
    • 2012-05-20
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多