在pandas数据帧中分组

时间:2013-05-07 07:22:02

标签: python dataframe pandas

我有一个pandas数据框如下。我想获取('User_ID','Exec_No')

的所有组合的'Job_No'列表
   User_ID Exec_No Job_No
1:    2      1      1   
2:    2      2      2 
3:    3      2      3
4:    1      2      4
5:    1      1      5
6:    3      2      6
7:    2      2      7
8:    1      1      8

所需的输出是另一个看起来像

的数据框
  User_ID Exec_No Job_No
1:    2      1      [1]   
2:    2      2      [2,7] 
3:    3      2      [3,6]
4:    1      2      [4]
5:    1      1      [5,8]

如何使用几行代码执行此操作?

此外,数据框预计有大约一百万行。因此,表现也很重要。

4 个答案:

答案 0 :(得分:2)

请注意,如果您关心性能,那么在DataFrame中存储列表效率不高。对数据进行分组后,可以立即访问Job_No值,无需创建一个新的DataFrame(内存!),其中包含Job_No per(User_Id,Exec_No)对的列表。

In [21]: df
Out[21]:
   User_ID  Exec_No  Job_No
0        2        1       1
1        2        2       2
2        3        2       3
3        1        2       4
4        1        1       5
5        3        2       6
6        2        2       7
7        1        1       8

In [22]: grouped = df.groupby(['User_ID', 'Exec_No'])

In [23]: grouped.get_group((3, 2))
Out[23]:
   User_ID  Exec_No  Job_No
2        3        2       3
5        3        2       6

In [24]: grouped.get_group((3, 2))['Job_No']
Out[24]:
2    3
5    6
Name: Job_No, dtype: int64

In [25]: list(grouped.get_group((3, 2))['Job_No'])
Out[25]: [3, 6]

答案 1 :(得分:0)

解决方案很简单。

如果'df'是数据框对象,那么

grp_df = df.groupby(['User_ID','Exec_No'])
newdf  = grp_df['Job_No']

答案 2 :(得分:0)

这将给予系列回报:

df.groupby(['User_ID', 'Exec_No']).apply(lambda x: x.Job_No.values)

将它包装在apply中的系列中会返回一个DataFrame:

df.groupby(['User_ID', 'Exec_No']).apply(lambda x: pd.Series([x.Job_No.values]))

User_ID Exec_No        
1       1        [5, 8]
        2           [4]
2       1           [1]
        2        [2, 7]
3       2        [3, 6]

如果将系列的name=用作结果列名称,那将是很好的,但它不是。

答案 3 :(得分:0)

这样怎么样:

df = pd.DataFrame({'User_ID' : [2,2, 3, 1, 1, 3, 2, 1], 'Exec_No': [1, 2, 2, 2, 1, 2, 2, 1], 'Job_No':[1,2,3,4,5,6,7,8]}, columns=['User_ID', 'Exec_No','Job_No'])

df
User_ID Exec_No Job_No
0    2   1   1
1    2   2   2
2    3   2   3
3    1   2   4
4    1   1   5
5    3   2   6
6    2   2   7
7    1   1   8

让我们分组:

df2 = df.groupby(['User_ID', 'Exec_No'], sort=False).apply(lambda x: list(x['Job_No']))
df2    
User_ID  Exec_No
2        1             [1]
         2          [2, 7]
3        2          [3, 6]
1        1          [5, 8]
         2             [4]

并按照你想要的方式:

df2.reset_index()

User_ID Exec_No 0
0    2   1   [1]
1    2   2   [2, 7]
2    3   2   [3, 6]
3    1   1   [5, 8]
4    1   2   [4]