Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 过滤掉np.nan并保留最大订单日期(如果客户有);分数“;_Python_Python 3.x_Pandas - Fatal编程技术网

Python 过滤掉np.nan并保留最大订单日期(如果客户有);分数“;

Python 过滤掉np.nan并保留最大订单日期(如果客户有);分数“;,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据框: pd.DataFrame({ 'acct_num': [1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3], 'score': [np.nan, np.nan, 300, 250, np.nan, 275, 400, 450, 9998, np.nan, np.nan], 'order_date': ['2021-05-11 20:29:22.656','2021-04-15 10:15:20.444', '2021-03-18 03

我有一个数据框:

pd.DataFrame({
'acct_num': [1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3],
'score': [np.nan, np.nan, 300, 250, np.nan, 275, 400, 450, 9998, np.nan, np.nan],
'order_date': ['2021-05-11 20:29:22.656','2021-04-15 10:15:20.444',
               '2021-03-18 03:29:22.400', '2021-02-21 22:05:22.399',
               '2021-05-05 12:01:19.699','2021-04-19 18:16:22.493',
               '2021-04-19 05:12:12.837', '2021-04-19 04:22:19.199',
               '2021-04-19 03:58:11.121', '2021-02-01 14:29:22.656',
               '2021-03-08 13:03:22.653']})
以下是输出的外观:

pd.DataFrame({
'acct_num': [1, 2, 3],
'score': [300, 450, np.nan],
'order_date': ['2021-03-18 03:29:22.400','2021-04-19 04:22:19.199',
              '2021-02-01 14:29:22.656']})
过滤此数据的逻辑如下所示:

  • 按帐号分组并返回得分不为空的最大订单日
  • 如果给定科目的所有分数均为空,则返回最大订单日期和分数为空
  • 如果acct_num在同一天订购两次,则返回当天的最高分数和订购日期(带时间戳)。除非分数为9998,否则如果同一天有其他非空分数,则应忽略该分数

  • 根据规则,然后按帐户数分组,然后检查每个组,查找最大分数和最大订单日期,并输出数据

     grouped2=df.groupby('acct_num').groups
     for group in grouped2:
         filter=(df['acct_num']==group) & (df['score']!=9998)
         max_score=df[filter]['score'].max()
         max_order_date=df[filter]['order_date'].max()
        print(max_score,max_order_date)
    
    输出:

     300.0 2021-05-11 20:29:22.656
     450.0 2021-05-05 12:01:19.699
     nan   2021-03-08 13:03:22.653
    

    首先我们将获得'acct_num'列的值,其中
    得分==9998
    ,然后我们将检查'acct_num'的计数是否大于1:

    val=df.loc[df['score']==9998,'acct_num'].values[0]
    cond=df.loc[df['acct_num']==val,'acct_num'].count()>1
    
    最后使用
    groupby()
    和布尔掩蔽:

    result=df[(df['score']!=9998) | (cond==True)].groupby('acct_num')[['order_date','score']].max()
    

    您无法筛选出9998,因为如果它是帐户的唯一非空值,则需要返回它。更新了我的答案…请查看:)谢谢,这非常有效!在您的数据框中,分数的值是否会变为负值?我的意思是你也有负值吗?不,分数实际上是指信用分数。没有负值。我不确定这是否有效。实际上,我的数据帧大于400万条记录,运行了30分钟,所以我停止了它。你可以在sql中做同样的事情,这将非常快地聚合。通常情况下,对于如此大的数据,我建议将数据帧分块读取,然后一次处理一个帐户,将结果放入列表中。我猜过滤器在大数据集上运行得非常慢。