如何使用Pandas从第二行开始处理DataFrame?附计算代码示例
Pandas从第二行开始处理DataFrame的实现方案
核心思路
要实现从第二行开始处理DataFrame,核心是跳过第一行,仅对索引从1开始的行应用计算逻辑,同时保留第一行的原始值或初始设定值。
具体实现方法
方法1:通过索引筛选后执行计算
先提取从第二行开始的子DataFrame进行计算,再将结果赋值回原DataFrame,第一行保持原值:
# 保留第一行的原始值(若为NaN则替换为启动资金) if pd.isnull(df.loc[0, "TodayTotalAmount"]): df.loc[0, "TodayTotalAmount"] = startupCapital # 对第二行及以后的行应用计算逻辑 df.loc[1:, "TodayTotalAmount"] = df.loc[1:].apply( lambda x: _computeTodayTotalAmount( x['OpeningMethods'], startupCapital, x['TodayTotalAmount'], df['TodayTotalAmount'].shift(1).loc[x.name] ), axis=1 )
方法2:在自定义函数中判断行索引
直接在计算函数内判断当前行是否为第一行,若是则返回初始值,否则执行计算:
import pandas as pd def _computeTodayTotalAmount(row, startupCapital): # 第一行直接返回初始值(或原始值) if row.name == 0: return row['TodayTotalAmount'] if not pd.isnull(row['TodayTotalAmount']) else startupCapital # 后续行执行原有计算逻辑 today_val = row['TodayTotalAmount'] yesterday_val = df['TodayTotalAmount'].shift(1).loc[row.name] if pd.isnull(today_val): today_val = startupCapital else: if row['OpeningMethods'] == "Long": return today_val - yesterday_val elif row['OpeningMethods'] == "Short": return -(today_val - yesterday_val) else: return 0 # 调用apply时传入行数据和启动资金参数 df["TodayTotalAmount"] = df.apply(lambda x: _computeTodayTotalAmount(x, startupCapital), axis=1)
注意事项
- 如果你的DataFrame索引不是连续整数(从0开始),需要先执行
df.reset_index(drop=True)重置索引,确保行判断逻辑生效。 - 使用
shift(1)时,第一行的前一日值会是NaN,这也是我们跳过第一行处理的关键原因。
内容的提问来源于stack exchange,提问作者陈哲珂
相关产品推荐
相关产品推荐

