首页 > 解决方案 > 如果客户有“分数”,则过滤掉 np.nan 并保留 max order_date

问题描述

我有一个熊猫数据框:

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']})

过滤此数据的逻辑如下:

  1. 按帐号分组并返回分数不为 Null 的最大 order_date。
  2. 如果给定 acct_num 的所有分数都为 null,则返回最大 order_date 和 Null 分数。
  3. 如果acct_num在同一天两次下单,则返回当天最高分和order_date(带时间戳)。除非分数是 9998,否则如果同一天还有其他非 Null 分数,则该分数应忽略。

标签: pythonpython-3.xpandas

解决方案


首先,我们将获取“acct_num”列的值,score==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()

推荐阅读