Python 按日期和其他列值筛选数据

Python 按日期和其他列值筛选数据,python,pandas,Python,Pandas,df如下所示: df.columns = ['ReportDate', 'ClientId', 'ClientRevenue'] 我想获得所有报告收入较高的客户名单,包括2个日期。下面是一些未经测试的大纲代码,但不知道是否有更直接的python方法: enddatedf = df.loc[df['ReportDate'] == endDate] startdatedf = df.loc[df['ReportDate'] == startDate] endclients = enddatedf

df如下所示:

df.columns = ['ReportDate', 'ClientId', 'ClientRevenue']
我想获得所有报告收入较高的客户名单,包括2个日期。下面是一些未经测试的大纲代码,但不知道是否有更直接的python方法:

enddatedf = df.loc[df['ReportDate'] == endDate]
startdatedf = df.loc[df['ReportDate'] == startDate]

endclients = enddatedf['ClientId'].unique()
startclients = startdatedf['ClientId'].unique()
commonclients = list(set(startclients).intersect(set(endclients)) #because clients might have dropped off in b/w

risingclients = []
for client in commonclients:
    startrevenue = startdatedf.loc[startdatedf['ClientId'] == client, 'ClientRevenue'].values[0]
    endrevenue = enddatedf.loc[enddatedf['ClientId'] == client, 'ClientRevenue'].values[0]
    if endrevenue > startrevenue:
    risingclients.append(client)
谢谢

df=df.sort_值(['ReportDate'],升序=[True])#确保您的ReportDate是datetime列
df = df.sort_values(['ReportDate'], ascending=[True]) #Ensure your ReportDate is datetime column
df = df[(df['ReportDate'] > startDate) & (df['date'] <= endDate)] #You can have startDate, endDate as variables at top of your code section
del df['ReportDate']
df = df.groupby(['ClientId'],as_index=False).sum()
df = df.sort_values(['ClientRevenue'], ascending=[False])
top5 = df.head(5)   #Selecting the top 5 clients

df=df[(df['ReportDate']>startDate)和(df['date']创建数据。请在您的问题中提供数据:

第一步是过滤df中的startdate和enddate

df = df.loc[((df['ReportDate']==startdate) | (df['ReportDate']==enddate)),:]
接下来,对数据帧进行排序,以便按照日期顺序将客户端放在一起

df = df.sort_values(['ClientId','ReportDate'])

ReportDate  ClientId  ClientRevenue
4 2019-01-01         1           3211
1 2019-03-31         1           8493
0 2019-01-01         2           1432
5 2019-03-31         2           8763
2 2019-01-01         3           2316
3 2019-03-31         3           2145
接下来,从enddate ClientRevenue中减去startdate ClientRevenue。如果该值为正值,则客户机在这两个日期之间有增长

result = df.groupby('ClientId').last() - df.groupby('ClientId').first()
print(result)

         ReportDate  ClientRevenue
ClientId                          
1           89 days           5282
2           89 days           7331
3           89 days           -171
最后,过滤结果数据框中的正“ClientRevenue”,并将索引(“ClientId”)放入列表中

编辑 我错过了关于客户流失的部分,但我回去测试了,它仍然有效

正在添加ClientId=0,但仅使用startdate

  ReportDate  ClientId  ClientRevenue
0 2019-01-01         0           1324
1 2019-01-01         2           1432
2 2019-03-31         1           8493
3 2019-01-01         3           2316
4 2019-03-31         3           2145
5 2019-01-01         1           3211
6 2019-03-31         2           8763
计算结果为:

         ReportDate  ClientRevenue
ClientId                          
0            0 days              0
1           89 days           5282
2           89 days           7331
3           89 days           -171

ClientId with positive return:  [1, 2]

除了列名之外,还可以包含数据帧的一个小样本吗?如果要传递到set(),为什么要调用unique?
  ReportDate  ClientId  ClientRevenue
0 2019-01-01         0           1324
1 2019-01-01         2           1432
2 2019-03-31         1           8493
3 2019-01-01         3           2316
4 2019-03-31         3           2145
5 2019-01-01         1           3211
6 2019-03-31         2           8763
         ReportDate  ClientRevenue
ClientId                          
0            0 days              0
1           89 days           5282
2           89 days           7331
3           89 days           -171

ClientId with positive return:  [1, 2]