当前位置: 首页 > 知识库问答 >
问题:

groupby并将键的所有值放在一行中

缑嘉玉
2023-03-14

我有一个熊猫数据框,如下所示

buyer_id  item_id  order_id    date        qty_purchased  qty_bought
     210      82      470  2016-01-02              5           1
     169      57      475  2016-01-02              5           1
     169      83      475  2016-01-02              5           1
     228      82      520  2016-01-03              4           1
     228      86      520  2016-01-03              4           1
     228      90      520  2016-01-03              4           1
     229      57      521  2016-01-03              4           1
     232      82      525  2016-01-04              4           3
     210      90      526  2016-01-04              4           1
     210      91      526  2016-01-04              5           1
     210      15      526  2016-01-05              5           1
     233      90      527  2016-01-05              4           1

我想找到每个日期介绍的item_id,如果item_id介绍超过1个日期,那么我想找到每个日期的比例'(qty_bought/qty_purchased)。

我想要的输出如下

Item_id date 1st Introduced  Ratio Date 2nd Introduced Ratio Date 3rd Introduced Ratio Flag

 82        2016-01-02        1/5       2016-01-03       1/4      2016-01-04       3/4    1

标志的条件是当比率大于以前的日期时,应将其设置为1或0

如果我在5个不同的日期引入了项目,那么这将动态生成5个日期和比率列。比率将具体到该日期。我只想列出那些引入了多次的项目id

这是我对python的尝试

df.groupby('item_id')['date'].apply(lambda x: np.unique(x.tolist()))

这给了我item_id的列表以及它们被介绍的日期。现在我想子集以上,如果项目已介绍了超过1个日期。

df.groupby('item_id').apply(lambda r: r['date'].unique().shape[0] > 1)

这为我提供了超过一个日期介绍的所有项目id。但我不知道如何使用所需的输出生成数据帧,以及如何添加日期


共有1个答案

公孙新觉
2023-03-14

这个问题的第一部分是选择那些具有多个日期的item\u id的行,并仅使用这些项目创建一个新的日期框。

#subset the items which have more than one date
items_1 = df.groupby('item_id').filter(lambda x: len(np.unique(x['date']))>1).item_id
#create a new dataframe with just those items that have more than one date
new_df = df[df['item_id'].isin(items_1)].copy()
#create the ratio columns
new_df['ratio'] = new_df['qty_bought']/new_df['qty_purchased']
#delete the columns that are not required
new_df.drop(['order_id', 'buyer_id','qty_purchased', 'qty_bought'], axis = 1, inplace= True)

 item_id    date    ratio
0   82  2016-01-02  0.20
1   57  2016-01-02  0.20
3   82  2016-01-03  0.25
5   90  2016-01-03  0.25
6   57  2016-01-03  0.25
7   82  2016-01-04  0.75
8   90  2016-01-04  0.25
11  90  2016-01-05  0.25

问题的第二部分是每个唯一的项目id只有一行,对应的日期和比率有多列。我们使用groupby获取每个item\u id的条目,然后迭代其dateratio值,同时将它们添加到日期框中新创建的列中。

#group by items and grab each date after the first and insert in a new column
for name, group in new_df.groupby('item_id'):
    for i in range(1, len(group)):
        new_df.loc[group.index[0], 'date'+str(i+1)] = group.date.iloc[i]
        new_df.loc[group.index[0], 'ratio'+str(i+1)] = group.ratio.iloc[i]
#delete the original date column since that information was replicated
new_df.drop(['date', 'ratio'], axis =1, inplace=True)
#keep only one row for each `item_id`
new_df.dropna(subset = ['date0'])


   item_id  date     ratio   date2     ratio2   date3     ratio3
0   82  2016-01-02  0.20    2016-01-03  0.25    2016-01-04  0.75
1   57  2016-01-02  0.20    2016-01-03  0.25    NaN         NaN
5   90  2016-01-03  0.25    2016-01-04  0.25    2016-01-05  0.25
 类似资料:
  • 我有一个简单的JSON对象{“a”:{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”},我想用一列“Key”将其转换成行。问题是我事先不知道钥匙的名字,或者有多少。换句话说,可能有“键4”、“键5”。也可能有“xyz1”:“xyz1”作为“a”对象中的键/值。我可以用JavaScript迭代这个JSON对象,但我这里的任务是,假设这个JSON对象作为

  • 我想像这样加入wp_posts和wp_postmeta表: 但是我需要wp_postmeta表中键值对的值在一行中;因此select语句看起来如下所示: wp_postmeta表中的3行显示方式如下: **POST_ID meta_key META_VALUE**23841 job_start 1488386107 23841 JOB_REQUIRECTIONS null 23841 JOB_EM

  • 我有一个这样的数据帧: 必修的: 相关链接:pandas groupby的最小和最大行 pandas groupby中两个系列的最大值和最小值 pandas groupby中的最大和最小日期 单击groupby,然后按列的值(例如,最小值、最大值)选择一行

  • 问题内容: 我需要将单行的所有而不是空值放入一个字符串中,例如 表: 导致: 重要说明-我不知道字段名称/类型,因此它应该遍历所有字段,并且所有非null值都将添加到列表中。 看起来它可以使用xquery做到这一点,但找不到正确的语法。有什么提示吗? 谢谢! 问题答案: select T2.N.value(‘local-name(.)’, ‘nvarchar(128)’)+’: ‘+ T2.N.v

  • 我试图实现每个组的并行性,其中分组元素并行运行,组内每个元素按顺序工作。然而,对于下面的代码,第一个emit使用并行线程,但对于后续emit,它使用一些不同的线程池。如何实现组的并行性和组内元素的顺序执行。 日志

  • 问题内容: 我想用SQL对行进行分组,我的结果集如下 name size date data1 123 12/03/2009 data1 124 15/09/2009 data2 333 02/09/2010 data2 323 02/11/2010 2010 data2 673 2014/02/09 data2 444 05/01/2010 我想对结果集进行这样的分组: data1 123 12