Cách chuyển một cột trong Pandas DataFrame


100

Tôi muốn chuyển một cột trong một con gấu trúc DataFrame, nhưng tôi không thể tìm thấy phương pháp để thực hiện điều đó từ tài liệu mà không cần viết lại toàn bộ DF. Có ai biết làm thế nào để làm điều đó? Khung dữ liệu:

##    x1   x2
##0  206  214
##1  226  234
##2  245  253
##3  265  272
##4  283  291

Sản phẩm chất lượng:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291

3
điều này thực sự phải là một lá cờ tùy chọn để thay đổi chức năng
KIC

Câu trả lời:


155
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

8
Kết quả thiếu ## 5. Có cách nào dễ dàng để gấu trúc mở rộng chỉ số khi sử dụng shift không?
Waylon Walker

@WaylonWalker Điều đó được gọi là lăn bánh:df['x2'] = np.roll(df['x2'], 1)
ayhan

1
Có ai hiểu ra điều này không? # 5 vẫn bị mất tích
Kritz

Tôi phải dịch chuyển 100 cột theo cùng một cách, làm thế nào tôi có thể tạo vòng lặp for?
Vincent Roye,

2
@Johan bạn đã thử thêm một hàng trống ở cuối trước khi chuyển nó chưa?
MikeyE

8

Bạn cần sử dụng df.shifttại đây.
df.shift(i)dịch chuyển toàn bộ khung dữ liệu theo iđơn vị xuống.

Vì vậy đối với i = 1 :

Đầu vào:

    x1   x2  
0  206  214  
1  226  234  
2  245  253  
3  265  272    
4  283  291

Đầu ra:

    x1   x2
0  Nan  Nan   
1  206  214  
2  226  234  
3  245  253  
4  265  272 

Vì vậy, hãy chạy tập lệnh này để nhận được kết quả mong đợi:

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
Chào mừng bạn đến với stackoverflow. Câu trả lời của bạn sẽ hữu ích hơn nếu bạn cung cấp một số giải thích về cách nó nên được sử dụng.
Simon.SA

1
một lần nữa bạn đã mất đi một hàng # 5 mà OP muốn rõ ràng
KIC

6

Hãy xác định khung dữ liệu từ ví dụ của bạn bằng cách

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

Sau đó, bạn có thể thao tác chỉ mục của cột thứ hai bằng cách

>>> df[2].index = df[2].index+1

và cuối cùng kết hợp lại các cột đơn

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

Có lẽ không nhanh nhưng đơn giản để đọc. Xem xét việc đặt các biến cho tên cột và sự thay đổi thực tế cần thiết.

Chỉnh sửa: Nói chung có thể thay đổi df[2].shift(1)như đã được đăng, tuy nhiên điều đó sẽ cắt đứt việc chuyển giao.


Tôi tự hỏi liệu có cách nào nhanh chóng để thực hiện việc này không và sử dụng chỉ mục ngày, Về cơ bản, bạn muốn thay đổi mà không cắt bớt chuỗi của chúng tôi và do đó bạn phải chỉ định các giá trị chỉ mục bổ sung. đối với sự thay đổi của từng người một, bạn sẽ nói điều gì đó như series.shift (-1, fill = [datetime (<some date>)]). Có phải bất cư thứ gì như thế này đều được? Ah tìm thấy nó ở đây stackoverflow.com/questions/36042804/…
OldSchool

5

Nếu bạn không muốn mất các cột bạn chuyển qua cuối khung dữ liệu của mình, trước tiên chỉ cần thêm số bắt buộc:

    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

Tôi cho rằng nhập khẩu

import pandas as pd
import numpy as np

Đầu tiên, nối thêm hàng mới NaN, NaN,...vào cuối 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

Nó sẽ tạo DF df2 mới. Có thể có cách thanh lịch hơn nhưng cách này hoạt động.

Bây giờ bạn có thể thay đổi nó:

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

2

Đang cố gắng trả lời một vấn đề cá nhân và tương tự như của bạn, tôi đã tìm thấy trên Pandas Doc những gì tôi nghĩ sẽ trả lời câu hỏi này:

DataFrame.shift (thời gian = 1, tần suất = Không, trục = 0) Chỉ số dịch chuyển theo số khoảng thời gian mong muốn với tần suất thời gian tùy chọn

Ghi chú

Nếu freq được chỉ định thì các giá trị chỉ mục được dịch chuyển nhưng dữ liệu không được sắp xếp lại. Đó là, sử dụng freq nếu bạn muốn mở rộng chỉ mục khi dịch chuyển và bảo toàn dữ liệu gốc.

Hy vọng sẽ giúp được những thắc mắc trong tương lai trong vấn đề này.


0

Đây là cách tôi làm điều đó:

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)

Về cơ bản, tôi đang tạo một khung dữ liệu trống với chỉ mục mong muốn và sau đó chỉ cần nối chúng lại với nhau. Nhưng tôi thực sự muốn xem đây là một tính năng tiêu chuẩn ở gấu trúc nên tôi đã đề xuất một cải tiến cho gấu trúc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.