我有两个数据框,一个包含一些购买数据,另一个包含每周日历,例如,Python根据复杂标准从第二个数据框中选择行
df1:
purchased_at product_id cost
01-01-2017 1 £10
01-01-2017 2 £8
09-01-2017 1 £10
18-01-2017 3 £12
df2:
week_no week_start week_end
1 31-12-2016 06-01-2017
2 07-01-2017 13-01-2017
3 14-01-2017 20-01-2017
我要使用的数据来自两个添加“week_no”列于DF1,这是从DF2基于其中在DF1的“purchased_at”日期落在“week_start”和“week_end”之间选择在日期DF2,即
df1:
purchased_at product_id cost week_no
01-01-2017 1 £10 1
01-01-2017 2 £8 1
09-01-2017 1 £10 2
18-01-2017 3 £12 3
我已经搜查,但我没能找到其中的数据正在从使用两者之间的比较第二数据帧拉到一个例子,我已经无法正确应用我找到的任何示例,例如
df1.loc[(df1['purchased_at'] < df2['week_end']) &
(df1['purchased_at'] > df2['week_start']), df2['week_no']
是不成功的,与ValueError异常“只能比较相同标记的Series对象”
任何人都可以帮助解决这个问题,或者我打开的建议,如果有更好的方式来实现同样的结果。
编辑添加的DF1的进一步详细
DF1全数据帧头部
purchased_at purchase_id product_id product_name transaction_id account_number cost
01-01-2017 1 1 A 1 AA001 £10
01-01-2017 2 2 B 1 AA001 £8
02-01-2017 3 1 A 2 AA008 £10
03-01-2017 4 3 C 3 AB040 £12
...
09-01-2017 12 1 A 10 AB102 £10
09-01-2017 13 2 B 11 AB102 £8
...
18-01-2017 20 3 C 15 AA001 £12
所以purchase_id每一行逐步增加,PRODUCT_ID和PRODUCT_NAME有一个1:1的关系, transaction_id也会逐步增加,但是在一个事务中可以有多次购买。
解析'df1'的日期应该足够了,因为您在这几个星期使用的定义似乎是*标准*之一。所以,请看看[this](https://stackoverflow.com/questions/2600775/how-to-get-week-number-in-python),而暂时忘掉'df2'。 –
在您的查询中,数据框将(通常)具有完全不同的形状。您需要在每个数据框中构建一个可以[加入]的密钥(https://pandas.pydata.org/pandas-docs/stable/merging.html)(尝试在df1中开始每周的某一天)。与上面的评论一起,这应该暗示一个解决方案 – Quickbeam2k1
这不是一个标准的定义,因为这个数字在未来几年会持续下去,所以明年将是53-104周等等,这就是为什么我想加入它单独而不是从内置公式计算。 – Sarah