繁体   English   中英

我有两个数据框 df1 和 df2,我需要使用 df2 中的键过滤掉 df1,使用 df2 中的开始和结束日期,我需要得到像 df3 这样的结果

[英]I have two data frames df1 and df2, I need to filter out df1 using keys in df2 using start and end dates in df2, I need to get a result like df3

我想使用来自 df2 的键过滤数据,并使用额外的过滤器来过滤开始和结束日期,然后需要使用此标准过滤 df1 以获得 df3(示例输出)

import pandas as pd

data1 = { 'KEY':  ['1747604', '1747604','2113901', '1747604','2113901', '2113901'],
       'date': ['2019-02-11', '2019-06-14', '2019-03-24', '2019-08-06', '2019-04-28' ,'2019-10-24'],
       'sales': [342, 234, 67, 564, 564 ,45]
      }
df1 = pd.DataFrame(data1, columns = ['KEY', 'date','sales'])

data2 = { 'KEY':  ['1747604', '2113901'],
       'strdate': ['2019-02-11', '2019-03-24'],
       'enddate': ['2019-07-06', '2019-09-26']
      }
df2 = pd.DataFrame(data2, columns = ['KEY', 'strdate','enddate'])

我需要一个 output 如下 df3 - 使用某种迭代行或 lambda,抱歉,我无法在任何地方找到答案。

df3
KEY date    sales
0   1747604 2019-02-11  342
1   1747604 2019-06-14  234
2   2113901 2019-03-24  67
3   2113901 2019-04-28  564

您需要先合并df1df2然后过滤date不在strdateenddate之间的行。

df3 = df1.merge(df2)
df3 = (df3[df3['date'].between(df3.strdate, df3.enddate)]
         .drop(columns = ['strdate', 'enddate']))

Output:

>>> df3
       KEY        date  sales
0  1747604  2019-02-11    342
1  1747604  2019-06-14    234
3  2113901  2019-03-24     67
4  2113901  2019-04-28    564
  1. 合并两个数据框。 这消除了KEY不在df2中的所有行。

df3 = df1.merge(df2, left_on='KEY', right_on='KEY')

  1. 过滤掉date不在strdateenddate之间的所有行。

df3 = df3[(df3.date >= df3.strdate) & (df3.date <= df3.enddate)]

  1. 删除仅用于过滤的不必要列。

df3 = df3.drop(["strdate", "enddate"], axis=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM