如何对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
相关产品推荐
相关产品推荐

