วิธีเปลี่ยนคอลัมน์ใน Pandas DataFrame


102

ฉันต้องการเปลี่ยนคอลัมน์ในแพนด้า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

คำตอบ:


156
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

9
ผลลัพธ์หายไป ## 5 มีวิธีง่ายๆในการขยายดัชนีเมื่อใช้กะหรือไม่?
Waylon Walker

@WaylonWalker ที่เรียกว่ากลิ้งใน numpy:df['x2'] = np.roll(df['x2'], 1)
ayhan

1
มีใครคิดออกไหม # 5 ยังขาดอยู่
Kritz

ฉันต้องเปลี่ยน 100 คอลัมน์ในลักษณะเดียวกันฉันจะสร้าง for loop ได้อย่างไร
Vincent Roye

2
@ โจฮันคุณลองเพิ่มแถวว่างในตอนท้ายก่อนที่จะเปลี่ยนหรือไม่?
กี้

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

2
อีกครั้งคุณแพ้หนึ่งแถว # 5 ซึ่ง OP ต้องการอย่างชัดเจน
KIC

6

ให้กำหนด dataframe จากตัวอย่างของคุณโดย

>>> 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/…
OldSchool

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 (period = 1, freq = None, axis = 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)

โดยทั่วไปฉันกำลังสร้าง dataframe ว่างพร้อมดัชนีที่ต้องการจากนั้นก็เชื่อมต่อเข้าด้วยกัน แต่ฉันอยากเห็นสิ่งนี้เป็นคุณสมบัติมาตรฐานของแพนด้าจริงๆดังนั้นฉันจึงเสนอให้มีการเพิ่มประสิทธิภาพให้กับแพนด้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.