pandas 多条件筛选下最旧日期对应my_list值的单行实现方法
Pandas 实现条件筛选后取最早/最晚日期对应值的单行方案
测试数据构造
先准备好通用测试DataFrame,构造代码如下:
import pandas as pd import numpy as np df = pd.DataFrame() df['date'] = pd.date_range("20130101", periods=12) df['bol'] = np.array([0,1,1,0,1,1,0,1,1,0,1,1]) df['language'] = np.array(['FR','EN','FR','EN','FR','EN','FR','EN','FR','EN','FR','EN']) df['doctype'] = np.array(['FAM','SELF','FAM','SELF','FAM','FAM','FAM','SELF','FAM','SELF','FAM','FAM']) set_claims = [[i,i+1] for i in range(12)] df['my_list'] = pd.Series(set_claims, index=df.index)
基础筛选规则
首先需要过滤出满足两个条件的行:language字段值为EN、doctype字段值为SELF,对应的基础查询代码为:
df.loc[(df.language=='EN') & (df.doctype=='SELF'), ]
需求与原始实现
需要在上述筛选结果的基础上,进一步只保留date字段取值最旧的行,最终直接获取该行的my_list字段值。
最初的实现采用两行代码,需要先存储中间变量:
oldest = df.loc[(df.language=='EN') & (df.doctype=='SELF'), ].date.min() df.loc[df.date == oldest,'my_list']
这种写法不够简洁,可替换为更流畅的单行实现方案。
单行优化实现
myval = (df.loc[(df.language=='EN') & (df.doctype=='SELF'),]).sort_values(by='date',ascending=True).head(1)['my_list'].iloc[0]
调整逻辑说明
- 如果需要获取筛选子集内日期最新的对应条目,只需将
sort_values方法的ascending参数调整为False即可 - 末尾加
iloc[0]的作用是直接拿到字段的原始值,不会返回pandas封装的Series对象
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

