python - 如果客户有“分数”,则过滤掉 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']})
过滤此数据的逻辑如下:
- 按帐号分组并返回分数不为 Null 的最大 order_date。
- 如果给定 acct_num 的所有分数都为 null,则返回最大 order_date 和 Null 分数。
- 如果acct_num在同一天两次下单,则返回当天最高分和order_date(带时间戳)。除非分数是 9998,否则如果同一天还有其他非 Null 分数,则该分数应忽略。
解决方案
首先,我们将获取“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()
推荐阅读
- node.js - 如何使用 Nodejs 处理具有 ms-rest-azure 的函数应用程序中的异常
- awk - 将排除数组添加到现有 awk 代码
- node.js - NPM 入门
- python - 将自定义标记应用于 pytest 参数化标记的特定值
- regex - 我如何在正则表达式中优先考虑我的“或”条件。我对编码还很陌生
- java - 如何在 android 中绘制从 Firebase 数据库中检索到的数据
- javascript - 通过 js/JavaScript 从网络摄像头捕获图像
- list - 将元素添加到符合 Prolog 中特定条件的另一个列表
- python-3.x - 如果父进程在 python 中崩溃,确保子进程被杀死。解决方案必须支持所有操作系统
- azure - 如何执行一次 Azure 函数?