Python 如何在DataFrame中移动列
我想在PandasPython 如何在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
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