在Pandas中用.shift和.apply求行最大值:避免临时列及多列移位解法
无临时列计算含移位列的行最大值
原始DataFrame
我们有如下DataFrame:
import pandas as pd df = pd.DataFrame({'A': [2.001, 4.001, 8.001, 0.001], 'B': [2.001, 0.001, 0.001, 0.001], 'C': [11.001, 12.001, 11.001, 8.001], 'D': [12.001, 23.001, 12.001, 8.021], 'E': [11.001, 24.001, 18.001, 8.0031]})
初始解法的局限
要计算每行中A、B、E列及E列下移一位(shift(-1))后的最大值,最初的写法是:
df["e_shifted"] = df["E"].shift(-1) df.apply(lambda x: max(x['A'], x['B'], x['E'], x['e_shifted']),axis = 1)
但这种方法会在DataFrame中创建临时列e_shifted,不够简洁。
如果尝试直接在apply里调用shift(-1):
df.apply(lambda x: max(x['A'], x['B'], x['E'], x['E'].shift(-1)),axis = 1)
会触发错误:
AttributeError: 'numpy.float64' object has no attribute 'shift'
原因是apply逐行处理时,x['E']是单个数值而非Series,无法调用shift方法。
单列移位的优化方案
@Corralien提供了无需保留临时列的解决方案,通过assign临时生成移位列后直接计算最大值:
out = df.assign(E_shift=df['E'].shift(-1))[['A', 'B', 'E', 'E_shift']].max(axis=1)
多列移位的问题与修正
如果要处理多列移位(比如同时移位E和A列),最初的尝试代码:
out = df.assign(E_shift=df['E'].shift(-1), A_shift=df['A'].shift(-1))[['A', 'B', 'E', 'E_shift', 'A_Shift']].max(axis=1)
会触发KeyError:
KeyError: "['A_Shift'] not in index"
这是因为列名拼写错误——assign里定义的是A_shift,但索引列表里写成了A_Shift(大小写不一致)。修正拼写后的正确代码为:
out = df.assign(E_shift=df['E'].shift(-1), A_shift=df['A'].shift(-1))[['A', 'B', 'E', 'E_shift', 'A_shift']].max(axis=1)
内容的提问来源于stack exchange,提问作者Prateek Daniels
相关产品推荐
相关产品推荐

