Làm thế nào để chuyển đổi chỉ mục của một cơ sở dữ liệu gấu trúc thành một cột?


455

Điều này có vẻ khá rõ ràng, nhưng tôi dường như không thể tìm ra cách chuyển đổi một chỉ mục của khung dữ liệu thành một cột?

Ví dụ:

df=
        gi       ptt_loc
 0  384444683      593  
 1  384444684      594 
 2  384444686      596  

Đến,

df=
    index1    gi       ptt_loc
 0  0     384444683      593  
 1  1     384444684      594 
 2  2     384444686      596  

Câu trả lời:


762

hoặc:

df['index1'] = df.index

hoặc .reset_index:

df.reset_index(level=0, inplace=True)

vì vậy, nếu bạn có khung đa chỉ mục với 3 cấp chỉ mục, như:

>>> df
                       val
tick       tag obs        
2016-02-26 C   2    0.0139
2016-02-27 A   2    0.5577
2016-02-28 C   6    0.0303

và bạn muốn chuyển đổi các cấp 1 ( tick) và 3 ( obs) trong chỉ mục thành các cột, bạn sẽ làm:

>>> df.reset_index(level=['tick', 'obs'])
          tick  obs     val
tag                        
C   2016-02-26    2  0.0139
A   2016-02-27    2  0.5577
C   2016-02-28    6  0.0303

4
Hãy nhớ rằng bạn phải thực hiện n lần này cho mỗi chỉ số bạn có (ví dụ: nếu bạn có hai chỉ số, thì bạn phải thực hiện hai lần)
dval

34
Với df.reset_index(level=df.index.names, inplace=True)một người có thể chuyển đổi toàn bộ đa điểm thành các cột
venti

2
Bạn có thể có một chỉ mục trên cột bạn vừa thêm vào khung dữ liệu để nó là cột thực sự VÀ chỉ mục không?
bretcj7

2
Nếu bạn muốn chuyển đổi toàn bộ multiindex, chỉ cần sử dụng df.reset_index(), nó sẽ di chuyển toàn bộ chỉ mục vào các cột (một cột trên mỗi cấp) và tạo một chỉ mục int từ 0 đến len (df) -1
BallpointBen

2
Việc gán cho một cột, ví dụ df['index1'] = df.indextrả về một cảnh báo: "Một giá trị đang cố gắng được đặt trên một bản sao của một lát cắt từ DataFrame." Sử dụng hàm df.assign () thay vào đó, như hiển thị bên dưới.
John Mark

36

Đối với Multi Index, bạn có thể trích xuất subindex của nó bằng cách sử dụng

df['si_name'] = R.index.get_level_values('si_name') 

nơi si_namelà tên của subindex.


26

Để cung cấp rõ ràng hơn một chút, chúng ta hãy xem DataFrame với hai cấp độ trong chỉ mục của nó (Multi Index).

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], 
                                    ['North', 'South']], 
                                   names=['State', 'Direction'])

df = pd.DataFrame(index=index, 
                  data=np.random.randint(0, 10, (6,4)), 
                  columns=list('abcd'))

nhập mô tả hình ảnh ở đây

Các reset_indexphương pháp, được gọi với các thông số mặc định, chuyển đổi tất cả các cấp chỉ số vào các cột và sử dụng một cách đơn giản RangeIndexnhư chỉ số mới.

df.reset_index()

nhập mô tả hình ảnh ở đây

Sử dụng leveltham số để kiểm soát mức chỉ số nào được chuyển đổi thành cột. Nếu có thể, sử dụng tên cấp độ, rõ ràng hơn. Nếu không có tên cấp, bạn có thể tham chiếu từng cấp theo vị trí số nguyên của nó, bắt đầu từ 0 từ bên ngoài. Bạn có thể sử dụng giá trị vô hướng ở đây hoặc danh sách tất cả các chỉ mục bạn muốn đặt lại.

df.reset_index(level='State') # same as df.reset_index(level=0)

nhập mô tả hình ảnh ở đây

Trong trường hợp hiếm hoi mà bạn muốn bảo toàn chỉ mục và biến chỉ mục thành một cột, bạn có thể thực hiện như sau:

# for a single level
df.assign(State=df.index.get_level_values('State'))

# for all levels
df.assign(**df.index.to_frame())

15

rename_axis + reset_index

Trước tiên, bạn có thể đổi tên chỉ mục của mình thành nhãn mong muốn, sau đó nâng lên thành một chuỗi:

df = df.rename_axis('index1').reset_index()

print(df)

   index1         gi  ptt_loc
0       0  384444683      593
1       1  384444684      594
2       2  384444686      596

Điều này cũng hoạt động cho MultiIndexdataframes:

print(df)
#                        val
# tick       tag obs        
# 2016-02-26 C   2    0.0139
# 2016-02-27 A   2    0.5577
# 2016-02-28 C   6    0.0303

df = df.rename_axis(['index1', 'index2', 'index3']).reset_index()

print(df)

       index1 index2  index3     val
0  2016-02-26      C       2  0.0139
1  2016-02-27      A       2  0.5577
2  2016-02-28      C       6  0.0303

4

Nếu bạn muốn sử dụng reset_indexphương thức và cũng bảo toàn chỉ mục hiện tại của mình, bạn nên sử dụng:

df.reset_index().set_index('index', drop=False)

hoặc để thay đổi nó tại chỗ:

df.reset_index(inplace=True)
df.set_index('index', drop=False, inplace=True)

Ví dụ:

print(df)
          gi  ptt_loc
0  384444683      593
4  384444684      594
9  384444686      596

print(df.reset_index())
   index         gi  ptt_loc
0      0  384444683      593
1      4  384444684      594
2      9  384444686      596

print(df.reset_index().set_index('index', drop=False))
       index         gi  ptt_loc
index
0          0  384444683      593
4          4  384444684      594
9          9  384444686      596

Và nếu bạn muốn thoát khỏi nhãn chỉ mục, bạn có thể làm:

df2 = df.reset_index().set_index('index', drop=False)
df2.index.name = None
print(df2)
   index         gi  ptt_loc
0      0  384444683      593
4      4  384444684      594
9      9  384444686      596

2
df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]})
p = df1.index.values
df1.insert( 0, column="new",value = p)
df1

    new     gi     ptt
0    0      232    342
1    1      66     56 
2    2      34     662
3    3      43     123

5
Tôi sẽ đề nghị thêm một số cuộc thảo luận về lý do tại sao bạn nghĩ câu trả lời này tốt hơn câu trả lời hiện có ...
dmcgrandle

0

Một cách rất đơn giản để làm điều này là sử dụng phương thức reset_index (). Đối với khung dữ liệu df sử dụng mã dưới đây:

df.reset_index(inplace=True)

Bằng cách này, chỉ mục sẽ trở thành một cột và bằng cách sử dụng inplace là True, điều này trở thành thay đổi vĩnh viễn.


1
Câu trả lời này khác với câu trả lời được chấp nhận như thế nào?
Annosz
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.