如何在Pandas DataFrame中移动一列

132

我想移动Pandas DataFrame中的一列,但我在文档中没有找到不重写整个DF的方法来完成它。有人知道如何做吗? DataFrame:

##    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

6
这应该是shift函数的可选标志。 - KIC
9个回答

190
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

10
在使用 shift 函数时,结果缺失了 ##5。在 pandas 中是否有一种简单的方法来扩展索引? - Waylon Walker
1
@WaylonWalker 这就是在numpy中所谓的滚动操作:df['x2'] = np.roll(df['x2'], 1) - ayhan
1
有人解决了这个问题吗?#5还是缺失的。 - Kritz
我需要以相同的方式移动100列,如何使用for循环实现? - Vincent Roye
3
@Johan 你尝试在移动之前在末尾添加一个空行吗? - MikeyE
你可以添加一个空行,例如: shift_pos = 1df = df.append(pd.DataFrame([[np.nan for i in df.columns] for i in range(shift_pos)], columns=df.columns)) - epifanio

15

你需要使用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.S.A.
4
你又丢失了一排#5,这是原帖明确想要的。 - KIC
这是一个更好的解决方案,因为它也可以适用于多列。谢谢! - Prakhar Rathi

8

让我们按照您的示例定义数据框:

>>> 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)实现移位,就像已经发布的一样,但这会截断进位。

我想知道是否有一种快速的方法来做到这一点,并使用日期索引。本质上,您想要进行移位而不截断我们的系列,因此必须指定其他索引值。对于一个移位为1的操作,您可以说类似于series.shift(-1, fill=[datetime(<some date>)]). 是否有类似的方法?啊,在这里找到了https://dev59.com/OZXfa4cB1Zd3GeqPaiM5 - OldSchool

7

如果您不想丢失您在数据框末尾移动过的列,只需先添加所需数量:

    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

首先,在DataFrame(df)末尾添加新行,使用NaN, NaN,...填充。

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

它会创建新的数据框 df2。也许有更优雅的方法,但这个方法有效。

现在你可以进行移位:

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

2

在回答个人问题并遇到与你类似的情况时,我在Pandas Doc中找到了一个可以解决这个问题的方法:

DataFrame.shift(周期=1,频率=无,轴=0) 通过所需的周期数将索引移位,并带有可选的时间频率

注释

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

希望能帮助解决未来的相关问题。


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

0

我是 pandas 的新手,可能没有完全理解问题,但这个解决方案对我的问题起了作用:

# 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”的最后一行实际上被推出了Dataframe的末端。我期望shift()有一个标志来改变这种行为,但我找不到任何东西。


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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接