Pandas DataFrame中获取元素索引值及对应日期的问题
获取Pandas DataFrame中价格最值对应的日期
嘿,作为Pandas新手遇到这个问题太正常啦!其实不用复杂操作,Pandas本身就有很便捷的方法来搞定这个需求,我给你拆解几种实用的方式:
方法1:用idxmax()/idxmin()快速获取单个最值日期
如果你的价格列里最大/最小值只有一个(或者你只需要第一个出现的对应日期),这个方法最直接:
# 假设你的DataFrame名为df,列名是date和price max_price_date = df.loc[df['price'].idxmax(), 'date'] min_price_date = df.loc[df['price'].idxmin(), 'date'] print(f"最高价对应的日期:{max_price_date}") print(f"最低价对应的日期:{min_price_date}")
解释一下:df['price'].idxmax()会返回price列最大值所在行的索引,然后用loc根据这个索引和列名date,直接取出对应的日期值。
方法2:获取所有最值对应的日期
如果price列里有多个相同的最大/最小值,想要把所有对应的日期都找出来,就用布尔索引:
# 获取所有最高价对应的日期 all_max_dates = df[df['price'] == df['price'].max()]['date'] # 转成列表更直观 all_max_dates_list = all_max_dates.tolist() # 获取所有最低价对应的日期 all_min_dates = df[df['price'] == df['price'].min()]['date'] all_min_dates_list = all_min_dates.tolist() print(f"所有最高价对应的日期:{all_max_dates_list}") print(f"所有最低价对应的日期:{all_min_dates_list}")
这里df['price'] == df['price'].max()会生成一个布尔Series,标记哪些行的价格是最大值,用这个布尔Series筛选DataFrame后,再取date列就能得到所有符合条件的日期。
用numpy where的正确姿势
你之前尝试numpy的where没成功,可能是用法没对,试试这个:
import numpy as np # 找出所有最大值所在的行索引 max_indices = np.where(df['price'] == df['price'].max())[0] # 根据索引取出对应的日期 max_dates = df.iloc[max_indices]['date'].tolist() print(f"用numpy where找到的最高价日期:{max_dates}")
np.where()返回的是一个包含索引数组的元组,所以要加[0]取出索引数组,再用iloc(按位置索引)来获取对应的行,最后取date列即可。
完整示例代码
我给你写了个可直接运行的示例,你可以替换成自己的数据测试:
import pandas as pd import numpy as np # 模拟从数据库提取的DataFrame data = { 'date': ['2023-05-01', '2023-05-02', '2023-05-03', '2023-05-04', '2023-05-05'], 'price': [120, 150, 130, 150, 110] } df = pd.DataFrame(data) # 方法1:单个最值日期 max_date_single = df.loc[df['price'].idxmax(), 'date'] min_date_single = df.loc[df['price'].idxmin(), 'date'] print(f"单个最高价日期:{max_date_single}") print(f"单个最低价日期:{min_date_single}\n") # 方法2:所有最值日期 all_max_dates = df[df['price'] == df['price'].max()]['date'].tolist() all_min_dates = df[df['price'] == df['price'].min()]['date'].tolist() print(f"所有最高价日期:{all_max_dates}") print(f"所有最低价日期:{all_min_dates}\n") # numpy where方法 max_indices = np.where(df['price'] == df['price'].max())[0] max_dates_np = df.iloc[max_indices]['date'].tolist() print(f"numpy where方法获取的最高价日期:{max_dates_np}")
内容的提问来源于stack exchange,提问作者Bit Magazin
相关产品推荐
相关产品推荐

