如何实现Pandas列的条件移位?现有代码未达预期
Pandas条件移位:将i>6对应的price值移到指定位置
需要将DataFrame中i>6对应的price值,移到索引3到6的位置,其余位置填充NaN,原代码无法得到预期结果。
原实现代码
import pandas as pd import numpy as np # Creating data for 'i' and 'price' columns n = 10 # Number of entries i_values = list(range(1, n+1)) price_values = [10.99, 19.99, 5.99, 8.49, 12.99, 15.99, 9.99, 14.99, 6.99, 11.99] # Creating DataFrame data = {'i': i_values, 'price': price_values} df = pd.DataFrame(data) df['price_new'] = df.loc[df.i>6, 'price'].shift(-3)
预期输出
n = 10 # Number of entries i_values = list(range(1, n+1)) price_values = [10.99, 19.99, 5.99, 8.49, 12.99, 15.99, 9.99, 14.99, 6.99, 11.99] new_price_values = [np.NaN, np.NaN, np.NaN, 9.99, 14.99, 6.99, 11.99, np.NaN, np.NaN, np.NaN] # Creating DataFrame data = {'i': i_values, 'price': price_values, 'new_price': new_price_values} df = pd.DataFrame(data)
问题分析
原代码的核心问题是:对筛选后的子Seriesdf.loc[df.i>6, 'price']执行shift(-3)时,只会在该子Series内部移动值,最终仅索引6的位置会被赋值为索引9的price值,其余位置全为NaN,完全不符合预期。
正确解法
方式一:直接提取值并赋值
先提取i>6对应的price值,再直接赋值到目标索引位置:
import pandas as pd import numpy as np n = 10 i_values = list(range(1, n+1)) price_values = [10.99, 19.99, 5.99, 8.49, 12.99, 15.99, 9.99, 14.99, 6.99, 11.99] df = pd.DataFrame({'i': i_values, 'price': price_values}) # 提取i>6对应的price值 target_prices = df.loc[df['i'] > 6, 'price'].values # 初始化新列为NaN,赋值到目标索引位置 df['price_new'] = np.nan df.loc[3:6, 'price_new'] = target_prices
方式二:利用索引对齐实现移位
通过掩码创建临时序列,再调整索引实现移位效果:
import pandas as pd import numpy as np n = 10 i_values = list(range(1, n+1)) price_values = [10.99, 19.99, 5.99, 8.49, 12.99, 15.99, 9.99, 14.99, 6.99, 11.99] df = pd.DataFrame({'i': i_values, 'price': price_values}) # 创建掩码标记i>6的行 mask = df['i'] > 6 # 生成仅保留目标值的临时序列 temp_series = df['price'].where(mask) # 将临时序列索引向前偏移3位,对齐原DataFrame索引 df['price_new'] = temp_series.reindex(df.index - 3)
两种方式均可得到预期结果:price_new列前3行、后3行为NaN,索引3-6依次为9.99、14.99、6.99、11.99。
内容的提问来源于stack exchange,提问作者r ram
相关产品推荐
相关产品推荐

