我有以下数据框:
data = {'A': [1,2,3,4,5,6,7], 'B':[1.1,1.3,1.35,1.43,1.5,1.54,1.6]}
df1 = pd.DataFrame(data=data)
我想创建一个新的df,其值基于对df1中B列的操作。
新df2 ['Output']中的每一行:
= -B[i] + 2*B[i+1] -B[i+2]
我代表行号。
df2中每行的新名称应结合A列中的数字。
结果数据框应如下图所示
df2 = pd.DataFrame({'Output':[0.15,-0.03,0.01,0.03,-0.02]})
df2['Name'] = ['123', '234','345','456','567']
谢谢!
答案 0 :(得分:2)
根据您的逻辑:
df2 = (df['B'].shift() * 2 - df['B'] - df['B'].shift(2)).to_frame(name='Output')
或者您可以
df2 = (-df['B'].diff().diff()).to_frame(name='Output')
输出:
Output
0 NaN
1 NaN
2 0.15
3 -0.03
4 0.01
5 0.03
6 -0.02
答案 1 :(得分:1)
如果我正确理解了这个问题,则结果数据帧应仅包含非NaN值(对于i,i + 1和i + 2有效)。我认为答案也将不需要对@Quang Hoang提供的内容进行任何修改。
df2 = (df1['B'].shift() * 2 - df1['B'] - df1['B'].shift(2)).to_frame(name='Output').shift(-2).dropna()
输出:
>>> df2 = (df1['B'].shift() * 2 - df1['B'] - df1['B'].shift(2)).to_frame(name='Output').shift(-2).dropna()
>>> df2
Output
0 0.15
1 -0.03
2 0.01
3 0.03
4 -0.02