我想在Pandas DataFrame
中移动一列,但是我无法在不重写整个DF的情况下从文档中找到一种方法。有谁知道怎么做?
数据帧:
## x1 x2
##0 206 214
##1 226 234
##2 245 253
##3 265 272
##4 283 291
期望的输出:
## x1 x2
##0 206 nan
##1 226 214
##2 245 234
##3 265 253
##4 283 272
##5 nan 291
答案 0 :(得分:129)
In [18]: a
Out[18]:
x1 x2
0 0 5
1 1 6
2 2 7
3 3 8
4 4 9
In [19]: a.x2 = a.x2.shift(1)
In [20]: a
Out[20]:
x1 x2
0 0 NaN
1 1 5
2 2 6
3 3 7
4 4 8
答案 1 :(得分:4)
如果您不想丢失转移数据框结尾的列,只需先添加所需的数字:
offset = 5
DF = DF.append([np.nan for x in range(offset)])
DF = DF.shift(periods=offset)
DF = DF.reset_index() #Only works if sequential index
答案 2 :(得分:3)
我想进口
import pandas as pd
import numpy as np
首先在DataFrame(NaN, NaN,...
)的末尾添加df
的新行。
s1 = df.iloc[0] # copy 1st row to a new Series s1
s1[:] = np.NaN # set all values to NaN
df2 = df.append(s1, ignore_index=True) # add s1 to the end of df
它将创建新的DF df2。也许有更优雅的方式,但这是有效的。
现在你可以改变它:
df2.x2 = df2.x2.shift(1) # shift what you want
答案 3 :(得分:3)
让我们根据示例定义数据框
>>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]],
columns=[1, 2])
>>> df
1 2
0 206 214
1 226 234
2 245 253
3 265 272
4 283 291
然后您可以通过以下方式操纵第二列的索引
>>> df[2].index = df[2].index+1
最后重新组合单列
>>> pd.concat([df[1], df[2]], axis=1)
1 2
0 206.0 NaN
1 226.0 214.0
2 245.0 234.0
3 265.0 253.0
4 283.0 272.0
5 NaN 291.0
也许不快但是很容易阅读。考虑为列名和所需的实际移位设置变量。
编辑:通常df[2].shift(1)
可以转移,就像已经发布的那样,但是这会切断残留。
答案 4 :(得分:2)
您需要在此处使用df.shift
df.shift(i)将整个数据帧下移i个单位。
所以对于i = 1
输入:
x1 x2
0 206 214
1 226 234
2 245 253
3 265 272
4 283 291
输出:
x1 x2
0 Nan Nan
1 206 214
2 226 234
3 245 253
4 265 272
因此运行此脚本以获取预期的输出
import pandas as pd
df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'],
'x2': ['214', '234', '253', '272', '291']})
print(df)
df['x2'] = df['x2'].shift(1)
print(df)
答案 5 :(得分:1)
尝试回答个人问题,并且与您在Pandas Doc上发现的问题类似,我认为可以回答以下问题:
DataFrame.shift (句号= 1,频率=无,轴= 0) 按所需的周期数移动索引,并带有可选的时间频率
注释
如果指定了freq,则索引值会移位,但数据不会重新对齐。也就是说,如果您想在移位时扩展索引并保留原始数据,请使用freq。
希望能在以后解决此问题。
答案 6 :(得分:0)
这是我的方法:
df_ext = pd.DataFrame(index=pd.date_range(df.index[-1], periods=8, closed='right'))
df2 = pd.concat([df, df_ext], axis=0, sort=True)
df2["forecast"] = df2["some column"].shift(7)
基本上,我正在生成具有所需索引的空数据框,然后将它们串联在一起。但是我真的很想将此作为熊猫的标准功能,所以我对熊猫有proposed an enhancement。
答案 7 :(得分:0)
df3
1 108.210 108.231
2 108.231 108.156
3 108.156 108.196
4 108.196 108.074
... ... ...
2495 108.351 108.279
2496 108.279 108.669
2497 108.669 108.687
2498 108.687 108.915
2499 108.915 108.852
df3['yo'] = df3['yo'].shift(-1)
yo price
0 108.231 108.210
1 108.156 108.231
2 108.196 108.156
3 108.074 108.196
4 108.104 108.074
... ... ...
2495 108.669 108.279
2496 108.687 108.669
2497 108.915 108.687
2498 108.852 108.915
2499 NaN 108.852