【问题标题】:Combine top n-th rows of a group into a single row of list with Pandas使用 Pandas 将组的前 n 行组合成单行列表
【发布时间】:2021-10-04 12:14:47
【问题描述】:

这里是 Python 和 Pandas 的新手。

我正在尝试将基于单独列中的值的前 n 行与 Pandas 合并为一行。

使用一个假设的例子,假设我有下表已经按“金额”列进行了降序排序:

store_id item amount
00001 shirt 5
00001 sock 3
00001 pants 1
00002 sock 4
00002 pants 2
00002 shirt 1

我想生成一个按 store_id 分组的表,每行是基于“金额”列的值的前 n 个项目的列表。因此,如果我想按 store_id 查看前 2 项,表格将如下所示:

store_id item
00001 ['shirt', 'sock']
00002 ['sock', 'pants']

我尝试按照此处的建议进行操作:How to combine multiple rows into a single row with pandas,但是我一直遇到“'GroupedData' object is not subscriptable”错误。

非常感谢有关如何解决此问题的任何建议。提前谢谢你。

【问题讨论】:

  • 您是只想从每个组中获取 n 个顶部元素还是从每个组中获取 n 个最大元素?如果是前者,则使用df.groupby(...).first(2)

标签: python pandas pyspark


【解决方案1】:

由于您的表格已经按amount 列进行了降序排序,您可以通过GroupBy.head(n) 获得每个组的前n 行。要将这些前 n 行的item 列进一步分组到列表中,您可以进一步使用GroupBy.agg(),如下所示:

n = 2      # define n

(df.groupby('store_id').head(n)
   .groupby('store_id')['item'].agg(list)
).reset_index()

结果:

   store_id           item
0         1  [shirt, sock]
1         2  [sock, pants]

【讨论】:

  • 这行得通。非常感谢您的帮助。
  • @moses 很高兴为您提供帮助! :-)
【解决方案2】:

试试这个:

(df.sort_values('amount',ascending=False)
 .groupby('store_id')
 .agg({'item':lambda x: x.iloc[0:2].tolist()}))

【讨论】:

    【解决方案3】:

    试试:

    output = df.groupby("store_id") \
               .apply(lambda x: x.nlargest(2, "amount")["item"].tolist()) \
               .rename(index="item")
    
    >>> output
    store_id
    00001    [shirt, sock]
    00002    [sock, pants]
    Name: item, dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多