我有一个 DataFrame,其中一列是字典列表。我需要对包含字典列表的列应用条件并获取 bool 值。该条件包括日期时间格式。
lastDate = pd.to_datetime(date.today().replace(day=1) - timedelta(1))
Output is: Timestamp('2020-10-31 00:00:00')
数据框,
ID Name Status
1 Rav [{'status': 'SIGNUP', 'Date': datetime.datetime(2020, 10, 30, 2, 43, 18, 578000)}, {'status': 'REG_COMPLETED', 'Date': datetime.datetime(2020, 10, 30, 2, 55, 52, 120000)}]
2 Suv [{'status': 'SIGNUP', 'Date': datetime.datetime(2020, 11, 01, 2, 43, 18, 578000)}, {'status': 'REG_COMPLETED', 'Date': datetime.datetime(2020, 11, 01, 2, 55, 52, 120000)}]
3 Tim [{'status': 'SIGNUP', 'Date': datetime.datetime(2020, 11, 01, 2, 43, 18, 578000)}, {'status': 'REG_COMPLETED', 'Date': datetime.datetime(2020, 11, 01, 2, 55, 52, 120000)}]
4 Jaq [{'status': 'SIGNUP', 'Date': datetime.datetime(2020, 11, 01, 2, 43, 18, 578000)}, {'status': 'REG_COMPLETED', 'Date': datetime.datetime(2020, 11, 01, 2, 55, 52, 120000)}]
5 Tan [{'status': 'SIGNUP', 'Date': datetime.datetime(2020, 10, 30, 2, 43, 18, 578000)}, {'status': 'REG_COMPLETED', 'Date': datetime.datetime(2020, 10, 30, 2, 55, 52, 120000)}]
If the status = "REG_COMPLETED" and Date <= lastDate, THEN True else False
所需的输出,
ID Name Status
1 Rav True
2 Suv False
3 Tim False
4 Jaq False
5 Tan True
我尝试了这个,但给了我一个空的 DataFrame,
df[df['status'].apply(lambda x: x[0]['Status']=='REG_COMPLETED' and x[0]['Date']<=lastDate)]
最佳答案
使用列表理解来获取 Date
如果status
匹配条件,比较并测试是否至少有一个True
通过any
:
f = lambda x: any(y['Date'] <= lastDate for y in x if y['status']=='REG_COMPLETED')
df['Status'] = df['Status'].apply(f)
print (df)
ID Name Status
0 1 Rav True
1 2 Suv False
2 3 Tim False
3 4 Jaq False
4 5 Tan True
关于python - 如何使用 python 或 pandas 根据由字典列表组成的列来过滤 DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64658604/