0

我有一个熊猫数据框,如下所示。我想获取('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

4 回答 4

2

请注意,如果您关心性能,则将列表存储在 DataFrame 中并不是很有效。对数据进行分组后,可以立即访问 Job_No 值,无需创建一个新的 DataFrame(内存!)保存每个 (User_Id, Exec_No) 对的 Job_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]
于 2013-05-07T08:46:49.837 回答
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]
于 2013-05-07T19:37:45.723 回答
0

这将给出一个系列作为回报:

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

在应用程序中将其包装在一个系列中会返回一个 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=Series 的 用作结果列名,那就太好了,但事实并非如此。

于 2013-05-07T07:52:38.810 回答
0

解决方案很简单。

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

grp_df = df.groupby(['User_ID','Exec_No'])
newdf  = grp_df['Job_No']
于 2013-05-07T07:45:48.933 回答