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']})
过滤此数据的逻辑如下所示:
根据规则,然后按帐户数分组,然后检查每个组,查找最大分数和最大订单日期,并输出数据
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中做同样的事情,这将非常快地聚合。通常情况下,对于如此大的数据,我建议将数据帧分块读取,然后一次处理一个帐户,将结果放入列表中。我猜过滤器在大数据集上运行得非常慢。