127

我想在 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
4

9 回答 9

185
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
于 2012-06-11T14:35:02.033 回答
12

你需要在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)
于 2018-10-20T21:45:39.807 回答
7

让我们从您的示例中定义数据框

>>> 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)已经发布的方式进行转移,但是会切断结转。

于 2018-07-09T18:22:32.543 回答
5

如果您不想丢失超出数据框末尾的列只需先附加所需的数字:

    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
于 2017-05-31T20:41:00.960 回答
3

我想进口

import pandas as pd
import numpy as np

NaN, NaN,...首先在 DataFrame ( 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
于 2017-06-26T19:17:44.513 回答
2

试图回答一个与您类似的个人问题,我在Pandas Doc上找到了我认为可以回答这个问题的内容:

DataFrame.shift (periods=1, freq=None, axis=0) 将索引按所需的周期数移位,时间频率可选

笔记

如果指定了 freq,则索引值会移动,但数据不会重新对齐。也就是说,如果您想在移位时扩展索引并保留原始数据,请使用 freq。

希望对这件事的未来问题有所帮助。

于 2018-11-22T10:16:37.743 回答
1
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
于 2021-04-28T09:43:13.320 回答
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)

基本上我正在生成一个带有所需索引的空数据框,然后将它们连接在一起。但我真的很想将其视为 pandas 的标准功能,因此我提出了对 pandas 的增强

于 2019-06-28T05:46:19.340 回答
0

我是熊猫新手,我可能不理解这个问题,但这个解决方案适用于我的问题:

# Shift contents of column 'x2' down 1 row
df['x2'] = df['x2'].shift()

或者,创建一个内容为“x2”的新列向下移动 1 行

# Create new column with contents of 'x2'  shifted down 1 row
df['x3'] = df['x2'].shift()

在试图弄清楚这一点时,我阅读了 shift() 的官方文档,但这对我来说没有多大意义,并且没有引用此特定行为的示例。

请注意,“x2”列的最后一行被有效地推离了数据框的末尾。我希望 shift() 有一个标志来改变这种行为,但我找不到任何东西。

于 2022-01-29T21:42:33.607 回答