You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:47:52