Python Pandas:groupby列A并从其他列生成元组列表?
我想将用户事务聚合到pandas中的列表中。我不知道如何制作一个由多个字段组成的列表。比如说,Python Pandas:groupby列A并从其他列生成元组列表?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我想将用户事务聚合到pandas中的列表中。我不知道如何制作一个由多个字段组成的列表。比如说, df = pd.DataFrame({'user':[1,1,2,2,3], 'time':[20,10,11,18, 15], 'amount':[10.99, 4.99, 2.99, 1.99, 10.99]}) 看起来像 amount time user 0 10.99 20 1 1
df = pd.DataFrame({'user':[1,1,2,2,3],
'time':[20,10,11,18, 15],
'amount':[10.99, 4.99, 2.99, 1.99, 10.99]})
看起来像
amount time user
0 10.99 20 1
1 4.99 10 1
2 2.99 11 2
3 1.99 18 2
4 10.99 15 3
user time amount atpair
0 1 20 10.99 (10.99, 20)
1 1 10 4.99 (4.99, 10)
2 2 11 2.99 (2.99, 11)
3 2 18 1.99 (1.99, 18)
4 3 15 10.99 (10.99, 15)
user
1 [(10.99, 20), (4.99, 10)]
2 [(2.99, 11), (1.99, 18)]
3 [(10.99, 15)]
如果我这样做
print(df.groupby('user')['time'].apply(list))
我明白了
user
1 [20, 10]
2 [11, 18]
3 [15]
但如果我这样做了
df.groupby('user')[['time', 'amount']].apply(list)
我明白了
多亏了下面的答案,我知道我可以做到这一点
df.groupby('user').agg(lambda x: x.tolist()))
得到
amount time
user
1 [10.99, 4.99] [20, 10]
2 [2.99, 1.99] [11, 18]
3 [10.99] [15]
但是我想以相同的顺序对时间和金额进行排序,这样我就可以按顺序处理每个用户的事务
我在寻找一种方法来制作这个:
amount-time-tuple
user
1 [(20, 10.99), (10, 4.99)]
2 [(11, 2.99), (18, 1.99)]
3 [(15, 10.99)]
但是,也许有一种方法可以在不对两列进行“tupling”的情况下进行排序?IIUC:
In [101]: df.groupby('user').agg(lambda x: x.tolist())
Out[101]:
time amount
user
1 [23, 50] [2.99, 1.99]
2 [12] [1.99]
代码>应用(列表)会考虑系列索引而不是值。我认为您在寻找
df.groupby('user')[['time', 'amount']].apply(lambda x: x.values.tolist())
用户
1 [[23.0, 2.99], [50.0, 1.99]]
2 [[12.0, 1.99]]
为amount-time元组创建一个新列
atpair
df['atpair'] = list(zip(df.amount, df.time))
df = df.groupby('user')['atpair'].apply(lambda x : x.values.tolist())
数据框看起来像
amount time user
0 10.99 20 1
1 4.99 10 1
2 2.99 11 2
3 1.99 18 2
4 10.99 15 3
user time amount atpair
0 1 20 10.99 (10.99, 20)
1 1 10 4.99 (4.99, 10)
2 2 11 2.99 (2.99, 11)
3 2 18 1.99 (1.99, 18)
4 3 15 10.99 (10.99, 15)
user
1 [(10.99, 20), (4.99, 10)]
2 [(2.99, 11), (1.99, 18)]
3 [(10.99, 15)]
现在执行groupby并将列表附加到atpair
df['atpair'] = list(zip(df.amount, df.time))
df = df.groupby('user')['atpair'].apply(lambda x : x.values.tolist())
数据框看起来像
amount time user
0 10.99 20 1
1 4.99 10 1
2 2.99 11 2
3 1.99 18 2
4 10.99 15 3
user time amount atpair
0 1 20 10.99 (10.99, 20)
1 1 10 4.99 (4.99, 10)
2 2 11 2.99 (2.99, 11)
3 2 18 1.99 (1.99, 18)
4 3 15 10.99 (10.99, 15)
user
1 [(10.99, 20), (4.99, 10)]
2 [(2.99, 11), (1.99, 18)]
3 [(10.99, 15)]
根据巴拉斯的回答
df.groupby('user')[['time','amount']].apply(lambda x:list(map(tuple,x.values)))
这可以得到:
user
1 [(20.0, 10.99), (10.0, 4.99)]
2 [(11.0, 2.99), (18.0, 1.99)]
3 [(15.0, 10.99)]
dtype: object
你能发布你想要的数据集吗?