如何在Pandas DataFrame中移动列


100

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

3
这实际上应该是移位功能的可选标志
KIC

Answers:


155
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

8
结果缺少## 5。在使用shift时,熊猫是否有一种简单的方法来扩展索引?
Waylon Walker

@WaylonWalker在numpy中称为滚动:df['x2'] = np.roll(df['x2'], 1)
–ayhan

1
有人知道吗?#5仍不见了
克里茨(Kritz)'18

我必须以相同的方式移动100列,如何进行for循环?
文森特·罗伊

2
@Johan您是否尝试过在移入末尾添加一个空行?
MikeyE

8

您需要在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)

3
欢迎使用stackoverflow。如果您提供一些有关应如何使用的说明,则您的答案将更有用。
Simon.SA

1
再一次,您输了OP明确想要的#5行
KIC

6

让我们通过以下示例定义数据框:

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


我想知道是否有一种快速的方法来执行此操作,并且使用日期索引,从本质上讲,您想转移而不截断我们的序列,因此必须指定其他索引值。对于一个移位,您会说类似series.shift(-1,fill = [datetime(<some date>)])。这样的事情可能吗?啊在这里找到stackoverflow.com/questions/36042804/...
老校友

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

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

2

尝试回答一个个人问题,并且与您在Pandas Doc上发现的问题类似,我认为可以回答这个问题:

DataFrame.shift(周期= 1,频率=无,轴= 0)按所需的周期数移动索引,并具有可选的时间频率

笔记

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

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


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)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.