Pandas:groupby A 列并从其他列创建元组列表?

Posted

技术标签:

【中文标题】Pandas:groupby A 列并从其他列创建元组列表?【英文标题】:Pandas: groupby column A and make lists of tuples from other columns? 【发布时间】:2018-03-19 06:30:40 【问题描述】:

我想将用户交易汇总到 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    4.99    10     1
2    2.99    11     2
3    1.99    18     2
4   10.99    15     3

如果我这样做

print(df.groupby('user')['time'].apply(list))

我明白了

user
1    [20, 10]
2    [11, 18]
3        [15]

如果我这样做了

df.groupby('user')[['time', 'amount']].apply(list)

我明白了

user
1    [time, amount]
2    [time, amount]
3    [time, amount]

感谢下面的回答,我知道我可以做到这一点

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)]

但也许有一种方法可以在不“将”两列“元组”的情况下进行排序?

【问题讨论】:

你能发布你想要的数据集吗? 【参考方案1】:

基于 Bharath 的回答

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

【讨论】:

【参考方案2】:

为数量时间元组创建一个新列atpair

 df['atpair'] = list(zip(df.amount, df.time))

数据框的样子

        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)

现在执行 groupby 并将列表追加到atpair

 df = df.groupby('user')['atpair'].apply(lambda x : x.values.tolist())

数据框的样子

user
1    [(10.99, 20), (4.99, 10)]
2     [(2.99, 11), (1.99, 18)]
3                [(10.99, 15)]

【讨论】:

【参考方案3】:

apply(list) 将考虑系列索引而不是值。我认为您正在寻找

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]]

【讨论】:

【参考方案4】:

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]

【讨论】:

以上是关于Pandas:groupby A 列并从其他列创建元组列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何取消透视多个列并从任一列中排除值?

Pandas:通过分隔符拆分列并根据其他列重新排列

pandas DataFrame:规范化一个 JSON 列并与其他列合并

Pandas DataFrame Groupby 两列并获取计数

有啥方法可以扩展包含列表的 pandas Dataframe 中的列并从列表值本身中获取列名?

Pandas Groupby 列并获得频率为 0