如何在Pandas DataFrame中对指定行列索引的值进行数学比较
使用itertuples对比Pandas DataFrame特定列值
你有如下Pandas DataFrame:
import pandas as pd import numpy as np np.random.seed(2022) # 生成示例数据 close = np.sin(range(610)) + 10 high = close + np.random.rand(*close.shape) open_col = high - np.random.rand(*close.shape) low = high - 3 close[2] += 100 dates = pd.date_range(end='2022-06-30', periods=len(close)) # 创建DataFrame df = pd.DataFrame(index=dates, data=np.array([open_col, high, low, close]).T, columns=['Open', 'High', 'Low', 'Close'])
需求是判断每行中Open列的值是否小于Close列的值,以下是用itertuples实现的具体方法:
核心实现逻辑
itertuples()会将DataFrame的每一行转换为命名元组,元组包含行索引和各列的数值,你可以直接通过列名访问对应值,进而执行对比判断。
方法1:遍历生成结果列表
results = [] for row in df.itertuples(): # 提取当前行的Open、Close值及日期索引 date = row.Index open_val = row.Open close_val = row.Close # 执行判断 is_open_lt_close = open_val < close_val # 存储结果 results.append({ 'Date': date, 'Open': open_val, 'Close': close_val, 'Open < Close': is_open_lt_close }) # 转换为DataFrame查看完整结果 result_df = pd.DataFrame(results).set_index('Date') print(result_df.head())
输出结果:
Open Close Open < Close Date 2020-10-29 9.557631 10.000000 True 2020-10-30 10.794789 10.841471 True 2020-10-31 10.631242 110.909297 True 2020-11-01 9.639562 10.141120 True 2020-11-02 9.835697 9.243198 False
方法2:直接在原DataFrame添加判断列
如果只需要将判断结果作为新列添加到原DataFrame,用列表推导式更简洁:
df['Open < Close'] = [row.Open < row.Close for row in df.itertuples()] print(df[['Open', 'Close', 'Open < Close']].head())
关键说明
itertuples()生成的命名元组,属性名与DataFrame列名完全对应,无需额外映射- 相比
iterrows(),itertuples()的执行效率更高,因为它返回轻量级元组而非Series,适合处理大规模数据集 - 如果需要自定义元组名称,可以通过
name参数指定,例如df.itertuples(name='StockData'),之后可通过row.StockData.Open访问值
内容的提问来源于stack exchange,提问作者Callum
相关产品推荐
相关产品推荐

