如何用列表推导式从Pandas DataFrame按日期+时间提取值
看起来你在处理Pandas数据时遇到了小问题,我来帮你梳理一下解决方案:
首先得指出你原来代码里的小疏漏:for d, t in df其实是在遍历DataFrame的列名(也就是Date、Time、Value),完全不是你想要的遍历每一行的日期和时间组合,这就导致逻辑上出现了偏差。
下面给你几种实用的方案:
1. 直接生成纯数值列表
如果只是想要把所有Value按顺序整理成干净的数值列表,用iterrows()遍历每一行是最直接高效的:
value_list = [row['Value'] for _, row in df.iterrows()]
运行后得到的结果是[893, 990, 801, 701, 774],全是纯粹的数值,没有你讨厌的数组类型。
2. 生成(Date, Time)为键的字典(更贴合你的查找需求)
如果你的核心需求是通过「日期+时间」快速查找对应数值,那生成字典会更实用——毕竟列表没法直接通过键取值:
value_dict = {(row['Date'], row['Time']): row['Value'] for _, row in df.iterrows()}
之后你就能像这样快速获取目标值:
print(value_dict[('2017-01-05', 1600)]) # 输出 801 print(value_dict[('2017-02-01', 1800)]) # 输出 774
3. 修正你原来的筛选逻辑(不推荐,效率较低)
如果你坚持想用筛选的方式(比如考虑可能存在重复的(Date, Time)对),可以把原来的逻辑改成列表推导式,同时把数组转成单个数值:
# 用zip来遍历每一行的Date和Time组合 value_list = [df[(df['Date'] == d) & (df['Time'] == t)]['Value'].iloc[0] for d, t in zip(df['Date'], df['Time'])]
不过要提醒你,这种写法效率很低,因为每一次循环都要重新扫描整个DataFrame,数据量大的时候会明显变慢,所以优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Anthony W
相关产品推荐
相关产品推荐

