如何基于DataFrame奇偶索引跨行列计算新增列Data3?
Pandas根据索引奇偶性计算新增列
原始数据
首先给出你的初始DataFrame:
import pandas as pd df = pd.DataFrame({ 'Team': ['Team 1', 'Team 2', 'Team 3', 'Team 4'], 'Data 1': [10, 20, 15, 25], 'Data 2': [12, 15, 23, 14], })
需求说明
新增Data 3列,计算规则:
- 当索引为奇数时:
Data 3 = 当前行Data 1 + 下一行(索引+1)的Data 2 - 当索引为偶数时:
Data 3 = 当前行Data 1 + 上一行(索引-1)的Data 2
注意:索引0是偶数但没有上一行,索引3是奇数但没有下一行,这两个位置的Data 3会是缺失值。
解决方案1:使用apply逐行处理
适合小数据集,逻辑直观:
def calc_data3(row): idx = row.name if idx % 2 == 1: # 奇数索引 # 检查下一行是否存在 if idx + 1 < len(df): return row['Data 1'] + df.loc[idx+1, 'Data 2'] return pd.NA else: # 偶数索引 # 检查上一行是否存在 if idx - 1 >= 0: return row['Data 1'] + df.loc[idx-1, 'Data 2'] return pd.NA df['Data 3'] = df.apply(calc_data3, axis=1)
运行结果:
Team Data 1 Data 2 Data 3 0 Team 1 10 12 <NA> 1 Team 2 20 15 43 2 Team 3 15 23 30 3 Team 4 25 14 <NA>
解决方案2:布尔索引+shift(高效推荐)
适合大数据集,利用Pandas向量操作,避免逐行循环:
# 初始化Data3为缺失值 df['Data 3'] = pd.NA # 处理奇数索引:取当前Data1 + 下一行Data2(用shift(-1)实现) odd_idx = df.index % 2 == 1 df.loc[odd_idx, 'Data 3'] = df.loc[odd_idx, 'Data 1'] + df['Data 2'].shift(-1)[odd_idx] # 处理偶数索引(排除索引0):取当前Data1 + 上一行Data2(用shift(1)实现) even_idx = (df.index % 2 == 0) & (df.index != 0) df.loc[even_idx, 'Data 3'] = df.loc[even_idx, 'Data 1'] + df['Data 2'].shift(1)[even_idx]
shift(-1)会把Data 2列整体下移一行,正好对应"下一行的Data2";shift(1)则是上移一行,对应"上一行的Data2",配合布尔索引精准赋值,效率比apply高很多。
解决方案3:拆分DataFrame关联(备选)
如果觉得直接索引操作麻烦,可以拆分奇偶索引的DataFrame再合并:
# 拆分奇偶索引数据 odd_df = df[df.index % 2 == 1].copy() even_df = df[df.index % 2 == 0].copy() # 奇数行Data3:当前Data1 + 下一行的Data2 odd_df['Data 3'] = odd_df['Data 1'] + df.loc[odd_df.index + 1, 'Data 2'].values # 偶数行(除0)Data3:当前Data1 + 上一行的Data2 even_df.loc[even_df.index != 0, 'Data 3'] = even_df.loc[even_df.index != 0, 'Data 1'] + df.loc[even_df.index - 1, 'Data 2'].values # 合并并按索引排序 df = pd.concat([even_df, odd_df]).sort_index()
这种方式逻辑拆分清晰,适合更复杂的关联场景。
内容的提问来源于stack exchange,提问作者Link
相关产品推荐
相关产品推荐

