我有一个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]
如何使用几行代码执行此操作?
此外,数据框预计有大约一百万行。因此,表现也很重要。
答案 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]