pandas groupby和join list

时间:2014-05-21 21:25:18

标签: python pandas

我有一个数据帧df,有两列,我想组合一列并加入列表属于同一组,例如:

column_a, column_b
1,         [1,2,3]
1,         [2,5]
2,         [5,6]

过程完成后:

column_a, column_b
1,         [1,2,3,2,5]
2,         [5,6]

我想保留所有重复项。我有以下问题:

  • 数据框的dtypes是对象。 convert_objects()不会自动将column_b转换为列表。我怎样才能做到这一点?
  • df.groupby(...)。apply(lambda x:...)中的函数适用于什么? x的形式是什么?清单?
  • 解决我的主要问题?

提前致谢。

4 个答案:

答案 0 :(得分:28)

object dtype是一个全能型dtype,基本上不是指int,float,bool,datetime或timedelta。所以它将它们存储为列表。 convert_objects尝试将列转换为其中一个dtypes。

你想要

In [63]: df
Out[63]: 
   a          b    c
0  1  [1, 2, 3]  foo
1  1     [2, 5]  bar
2  2     [5, 6]  baz


In [64]: df.groupby('a').agg({'b': 'sum', 'c': lambda x: ' '.join(x)})
Out[64]: 
         c                b
a                          
1  foo bar  [1, 2, 3, 2, 5]
2      baz           [5, 6]

这会按照a列中的值对数据框进行分组。阅读更多关于[groupby]。(http://pandas.pydata.org/pandas-docs/stable/groupby.html)。

这是一个常规列表sum(连接),就像[1, 2, 3] + [2, 5]

一样

答案 1 :(得分:10)

df.groupby('column_a').agg(sum)

这是因为运算符重载sum将列表连接在一起。得到的df的索引将是column_a

的值

答案 2 :(得分:0)

使用numpy和简单的“用于”或“地图”:

import numpy as np

u_clm = np.unique(df.column_a.values)
all_lists = []

for clm in u_clm:
    df_process = df.query('column_a == @clm')
    list_ = np.concatenate(df.column_b.values)
    all_lists.append((clm, list_.tolist()))

df_sum_lists = pd.DataFrame(all_lists)

对于大型数据集,它比简单的“ groupby-agg-sum”方法快350倍。

答案 3 :(得分:0)

上面提出的使用 df.groupby('column_a').agg(sum) 的方法确实有效。但是,您必须确保您的列表只包含 integers,否则输出将不相同。

如果要将所有列表项转换为整数,可以使用:

df['column_a'] = df['column_a'].apply(lambda x: list(map(int, x)))