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

如何对Pandas DataFrame的每行独立执行左移位操作?

按行指定移位值实现Pandas行左移位

需求说明

现有两个Pandas DataFrame:

  • df1存储待处理的数值数据,以id为索引
  • s_df存储每个id对应的左移位次数shift_val

需要根据shift_val对df1的每行执行左移位操作,左移后右侧空缺位置填充NaN,得到指定的目标结果。

输入数据

待处理数据df1

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    'id': [11, 22],
    1: [0.001, 0.005],
    2: [0.004, 0.006],
}).set_index('id')

移位值配置s_df

s_df = pd.DataFrame({
    'id': [11, 22],
    'shift_val': [0, 1],
}).set_index('id')

目标结果

out = pd.DataFrame({
    'id': [11, 22],
    1: [0.001, 0.006],
    2: [0.004, np.nan],
}).set_index('id')

实现方案

方案一:逐行处理(简洁直观)

通过apply遍历每行,结合Series.shift()实现左移位:

# 合并移位值到原数据
df_with_shift = df1.join(s_df)

# 定义行移位函数
def shift_row(row):
    shift_num = row['shift_val']
    # 左移shift_num位,右侧补NaN
    return row.drop('shift_val').shift(-shift_num)

# 生成结果
out = df_with_shift.apply(shift_row, axis=1)

方案二:向量化实现(高效适合大数据集)

利用numpy广播机制实现批量移位,避免逐行循环的性能损耗:

shift_vals = s_df['shift_val'].values
cols = df1.columns
n_cols = len(cols)

# 计算每行移位后的有效索引位置
mask = np.arange(n_cols) - shift_vals[:, np.newaxis] >= 0
# 提取对应位置的值,无效位置填充NaN
result = np.where(mask, df1.values.take(np.arange(n_cols) - shift_vals[:, np.newaxis], axis=1), np.nan)

# 转换为DataFrame
out = pd.DataFrame(result, index=df1.index, columns=cols)

内容的提问来源于stack exchange,提问作者vvv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:15:36