如何在熊猫数据框中移动列

我想转移一个专栏在熊猫 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
179673 次浏览
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

如果你不想丢失数据帧末尾的列 转移过去,只需要首先附加所需的数字:

    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

首先在 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

它将创建新的 DF 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].shift(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

因此,运行这个脚本来获得预期的输出:

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)

试图回答一个个人问题,类似于你的问题,我在 熊猫医生上找到了我认为可以回答这个问题的答案:

Shift (周期 = 1,频率 = 无,轴 = 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)

基本上,我生成一个空的数据框与所需的索引,然后只是连接在一起。但是我真的很想把这看作是熊猫的一个标准功能,所以我有对熊猫的 提出了一项改进措施

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

我对熊猫还是个新手,我可能不明白这个问题,但是这个解决方案对我的问题很有效:

# 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 ()有一个标志来改变这种行为,但是我什么也找不到。