Pandas列值替换问题:按规则将CurrentCandleColor替换为PreviousCandleColor
解决Pandas中替换列值并偏移的问题
嘿,我来帮你搞定这个Pandas的问题!首先咱们先理清楚你的需求:你想要把CurrentCandleColor列的值替换成PreviousCandleColor列的下一行对应值——也就是第0行的CurrentCandleColor取第1行的PreviousCandleColor,第1行的CurrentCandleColor取第2行的PreviousCandleColor,最后一行保持原来的CurrentCandleColor值对吧?
先说说你之前代码的问题
你写的df['CurrentCandleColor'] = df[1:'PreviousCandleColor']是错误的语法,原因很简单:
- 在Pandas里,
df[1:]是对行进行切片,获取从第1行开始的所有行;而'PreviousCandleColor'是列名,你把行切片和列名混在一起用,Pandas没法用字符串去索引RangeIndex类型的行索引,所以才会抛出TypeError。
正确的解决方法
我们可以用Pandas的shift()函数来优雅实现这个偏移需求,具体步骤如下:
- 获取偏移后的Previous值:用
shift(-1)让PreviousCandleColor列整体向上偏移一行,这样每一行的位置就会对应下一行的PreviousCandleColor值,最后一行会变成NaN(因为没有下一行可以取了)。 - 修复最后一行的值:把最后一行的
NaN替换回原来的CurrentCandleColor值。
下面是完整的可运行代码:
import pandas as pd from io import StringIO # 模拟你的输入数据 data = """Time,RangeGreen,RangeRed,DistanceGreenRed,SlopeGreen,SlopeRed,PreviousCandleColor,CurrentCandleColor 2018.04.02 00:01:01,30-40,20-30,14.42241040084485,0.002837507264410963,-0.002233901393132696,Green,indecisive 2018.04.02 00:03:06,40-50,30-40,9.228956001044772,3.969502900848433,7.203315124348411,Green,indecisive 2018.04.02 00:04:06,10-20,30-40,-13.69498672180752,-19.36590965829607,-2.850639197642629,Red,indecisive""" # 读取数据到DataFrame df = pd.read_csv(StringIO(data)) # 执行偏移替换 df['CurrentCandleColor'] = df['PreviousCandleColor'].shift(-1) # 把最后一行的NaN替换为原Current值 df.loc[df.index[-1], 'CurrentCandleColor'] = df.loc[df.index[-1], 'CurrentCandleColor'].fillna(df.loc[df.index[-1], 'CurrentCandleColor']) # 输出结果 print(df.to_csv(index=False))
运行这段代码后,你会得到完全符合预期的结果:
Time,RangeGreen,RangeRed,DistanceGreenRed,SlopeGreen,SlopeRed,PreviousCandleColor,CurrentCandleColor 2018.04.02 00:01:01,30-40,20-30,14.42241040084485,0.002837507264410963,-0.002233901393132696,Green,Green 2018.04.02 00:03:06,40-50,30-40,9.228956001044772,3.969502900848433,7.203315124348411,Green,Red 2018.04.02 00:04:06,10-20,30-40,-13.69498672180752,-19.36590965829607,-2.850639197642629,Red,indecisive
补充说明
如果你有更多行数据,这个方法依然适用,shift(-1)会自动处理所有行的偏移,最后一行的NaN替换逻辑也能通用,不需要修改代码。
内容的提问来源于stack exchange,提问作者Jaffer Wilson
相关产品推荐
相关产品推荐

