簡體   English   中英

"如何在 Pandas DataFrame 中移動一列"

[英]How to shift a column in Pandas DataFrame

我想在 Pandas DataFrame<\/code>中移動一列,但我無法在不重寫整個 DF 的情況下從文檔中找到一種方法。 有誰知道該怎么做? 數據框:

##    x1   x2
##0  206  214
##1  226  234
##2  245  253
##3  265  272
##4  283  291
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

你需要在這里使用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)

讓我們從您的示例中定義數據框

>>> 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)轉移,正如已經發布的那樣,但是這會切斷結轉。

如果您不想丟失移過數據框末尾的列,只需先附加所需的數字:

    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

試圖回答一個個人問題,類似於你的問題,我在Pandas Doc上找到了我認為可以回答這個問題的內容:

DataFrame.shift (periods=1, freq=None,axis=0) 使用可選的時間頻率按所需的周期數移動索引

筆記

如果指定了 freq,則索引值會移動,但不會重新對齊數據。 也就是說,如果您想在移動時擴展索引並保留原始數據,請使用 freq。

希望對以后的問題有所幫助。

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

這就是我的做法:

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)

基本上我正在生成一個帶有所需索引的空數據框,然后將它們連接在一起。 但我真的很想將其視為熊貓的標准功能,因此我提出了對熊貓的增強

我是熊貓新手,我可能不理解這個問題,但這個解決方案適用於我的問題:

# 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”列的最后一行被有效地推離了數據框的末尾。 我希望 shift() 有一個標志來改變這種行為,但我找不到任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM