如何在Pandas DataFrame中正确实现列的条件移位?
在Pandas DataFrame中实现列的条件移位操作
你想要将i值大于6的price列数值移位到指定位置,但当前代码未达到预期效果。先看你的现有代码和预期输出:
现有代码
import pandas as pd import numpy as np # 创建'i'和'price'列数据 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] # 创建DataFrame data = {'i': i_values, 'price': price_values} df = pd.DataFrame(data) df['price_new'] = df.loc[df.i>6, 'price'].shift(-3)
预期输出
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] new_price_values = [np.NaN, np.NaN, np.NaN, 9.99, 14.99, 6.99, 11.99, np.NaN, np.NaN, np.NaN] # 创建DataFrame data = {'i': i_values, 'price': price_values, 'new_price': new_price_values} df = pd.DataFrame(data)
问题分析
原代码仅对i>6的行执行shift(-3),并将结果赋值给这些行的price_new,导致只有i>6的行有值(且多数为NaN),无法实现将i>6的price值转移到前3位索引位置的需求。
解决方案
通过提取符合条件的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}) # 初始化新列为NaN df['price_new'] = np.nan # 筛选出i>6的price数据 selected_prices = df[df['i'] > 6]['price'] # 将筛选出的值赋值到索引减3的位置 df.loc[selected_prices.index - 3, 'price_new'] = selected_prices.values print(df)
运行后即可得到与预期一致的结果:
i price price_new 0 1 10.99 NaN 1 2 19.99 NaN 2 3 5.99 NaN 3 4 8.49 9.99 4 5 12.99 14.99 5 6 15.99 6.99 6 7 9.99 11.99 7 8 14.99 NaN 8 9 6.99 NaN 9 10 11.99 NaN
内容的提问来源于stack exchange,提问作者Helga Steiner
相关产品推荐
相关产品推荐

