我有一个熊猫数据框,如下所示
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
。但我不知道如何使用所需的输出生成数据帧,以及如何添加日期
这个问题的第一部分是选择那些具有多个日期的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
的条目,然后迭代其date
和ratio
值,同时将它们添加到日期框中新创建的列中。
#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