Python 如何在DataFrame中移动列

Python 如何在DataFrame中移动列,python,pandas,dataframe,Python,Pandas,Dataframe,我想在PandasDataFrame中移动一列,但我无法在不重写整个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 na

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

如果您不想丢失数据帧末尾移动的列,只需先附加所需的数字:

    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
我想是进口的

import pandas as pd
import numpy as np
首先在数据帧(
df
)的末尾添加新行,并添加
NaN,NaN,…

它将创建新的df2。也许有更优雅的方式,但这是可行的

现在您可以移动它:

df2.x2 = df2.x2.shift(1)  # shift what you want

让我们通过以下方式定义示例中的数据帧:

>>> 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]进行移位。移位(1)
如已发布,但这会切断结转。

您需要在此处使用
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 
因此,运行此脚本以获得预期的输出:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291
将熊猫作为pd导入
df=pd.DataFrame({'x1':['206','226','245','265','283'],
‘x2’:[‘214’、‘234’、‘253’、‘272’、‘291’]})
打印(df)
df['x2']=df['x2'].移位(1)
打印(df)

试图回答一个与你类似的个人问题,我发现我认为可以回答这个问题:

DataFrame.shift(句点=1,频率=None,轴=0) 按所需周期数和可选时间频率进行移位索引

注释

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

希望对以后的问题有所帮助。

我就是这样做的:

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中,当使用shift时,有没有一种简单的方法来扩展索引?@WaylonWalker,它被称为在numpy中滚动:
df['x2']=np.roll(df['x2'],1)
有人发现了吗#5仍然丢失我必须以同样的方式移动100列,我如何才能创建for循环?@Johan在移动之前是否尝试在末尾添加一个空行?欢迎使用stackoverflow。如果您提供一些关于如何使用它的解释,您的答案将更有帮助。同样,您丢失了一行#5,这显然是OP需要的。这是一个更好的解决方案,因为它也可以用于多个列。谢谢这应该是shift函数的一个可选标志。我想知道是否有一种快速的方法可以做到这一点,并且使用日期索引,实际上您希望在不截断系列的情况下进行移位,因此您必须指定其他索引值。对于一个移位,您可以说类似于series.shift(-1,fill=[datetime()])。这样的事情可能吗?啊,在这里找到的
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
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