【问题标题】:Merge with groupby and where in Pandas (Python)与 groupby 合并以及 Pandas 中的 where (Python)
【发布时间】:2019-10-14 11:41:38
【问题描述】:

我有两张这样的桌子:

Customr Issue   Date_Issue
1   1   01/01/2019
1   2   03/06/2019
1   3   04/07/2019
1   4   13/09/2019
2   5   01/02/2019
2   6   16/03/2019
2   7   20/08/2019
2   8   30/08/2019
2   9   01/09/2019
3   10  01/02/2019
3   11  03/02/2019
3   12  05/03/2019
3   13  20/04/2019
3   14  25/04/2019
3   15  13/05/2019
3   16  20/05/2019
3   17  25/05/2019
3   18  01/06/2019
3   19  03/07/2019
3   20  20/08/2019

Customr Date_Survey df_Score
1   06/04/2019  10
2   10/06/2019  9
3   01/08/2019  3

并且我需要获取每个客户在调查日期前三个月内的问题数量。

但我无法在 Pandas 中获取此查询。

#first table
index_survey = [0,1,2]
Customer_Survey = pd.Series([1,2,3],index= index_survey)
Date_Survey = pd.Series(["06/04/2019","10/06/2019","01/08/2019"])
df_Score=[10, 9, 3]
df_survey = pd.DataFrame(Customer_Survey,columns = ["Customer_Survey"])
df_survey["Date_Survey"] =Date_Survey
df_survey["df_Score"] =df_Score

#And second table
index_survey = [0,1,2]
Customer_Survey = pd.Series([1,2,3],index= index_survey)
Date_Survey = pd.Series(["06/04/2019","10/06/2019","01/08/2019"])
df_Score=[10, 9, 3]
df_survey = pd.DataFrame(Customer_Survey,columns = ["Customer_Survey"])
df_survey["Date_Survey"] =Date_Survey
df_survey["df_Score"] =df_Score

我期待结果

Custr   Date_Survey Score   Count_issues
1   06/04/2019  10  0
2   10/06/2019  9   1
3   01/08/2019  3   5

【问题讨论】:

  • 在 Microsoft Access 中,查询将是 SELECT Survey.Customer_Survey、Survey.Date_Survey、Survey.df_Score、Count(Issues.Issue) AS CuentaDeIssue FROM Survey LEFT JOIN Issues ON Survey.Customer_Survey = Issues.Customer WHERE (((Issues.Date_Issue) DateAdd("m",-3,([Survey].[Date_Survey])) 和 DateAdd("m",0,([Survey].[Date_Survey])))) GROUP BY Survey.Customer_Survey、Survey.Date_Survey、Survey.df_Score;

标签: python pandas merge where-clause


【解决方案1】:

用途:

#convert columns to datetimes
df1['Date_Issue'] = pd.to_datetime(df1['Date_Issue'], dayfirst=True)
df2['Date_Survey'] = pd.to_datetime(df2['Date_Survey'], dayfirst=True)
#create datetimes for 3 months before 
df2['Date1'] = df2['Date_Survey'] - pd.offsets.DateOffset(months=3)

#merge together
df = df1.merge(df2, on='Customr')
#filter by between, select only Customr and get counts
s = df.loc[df['Date_Issue'].between(df['Date1'], df['Date_Survey']), 'Customr'].value_counts()

#map to new column and replace NaNs to 0
df2['Count_issues'] = df2['Customr'].map(s).fillna(0, downcast='int')
print (df2)
   Customr Date_Survey  df_Score      Date1  Count_issues
0        1  2019-04-06        10 2019-01-06             0
1        2  2019-06-10         9 2019-03-10             1
2        3  2019-08-01         3 2019-05-01             5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2019-05-12
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多