Chuyển đổi hàng thành tiêu đề cột cho Pandas DataFrame,


111

Dữ liệu tôi phải xử lý hơi lộn xộn .. Nó có tên tiêu đề bên trong dữ liệu của nó. Làm cách nào tôi có thể chọn một hàng từ khung dữ liệu gấu trúc hiện có và đặt nó (đổi tên thành) một tiêu đề cột?

Tôi muốn làm điều gì đó như:

header = df[df['old_header_name1'] == 'new_header_name1']

df.columns = header

Câu trả lời:


196
In [21]: df = pd.DataFrame([(1,2,3), ('foo','bar','baz'), (4,5,6)])

In [22]: df
Out[22]: 
     0    1    2
0    1    2    3
1  foo  bar  baz
2    4    5    6

Đặt các nhãn cột bằng các giá trị trong hàng thứ 2 (vị trí chỉ mục 1):

In [23]: df.columns = df.iloc[1]

Nếu chỉ mục có các nhãn duy nhất, bạn có thể bỏ hàng thứ 2 bằng cách sử dụng:

In [24]: df.drop(df.index[1])
Out[24]: 
1 foo bar baz
0   1   2   3
2   4   5   6

Nếu chỉ mục không phải là duy nhất, bạn có thể sử dụng:

In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]: 
1 foo bar baz
0   1   2   3
2   4   5   6

Sử dụng df.drop(df.index[1])loại bỏ tất cả các hàng có cùng nhãn với hàng thứ hai. Bởi vì các chỉ mục không phải là duy nhất có thể dẫn đến các lỗi (hoặc các lỗi tiềm ẩn) như thế này, nên tốt hơn hết là bạn nên cẩn thận để chỉ mục đó là duy nhất (mặc dù Gấu trúc không yêu cầu).


Cảm ơn bạn rất nhiều vì phản hồi nhanh chóng của bạn! Làm cách nào tôi có thể chọn một hàng theo giá trị thay vì vị trí chỉ mục để làm cho nó trở thành tiêu đề? Vì vậy, đối với ví dụ của bạn, một cái gì đó như .. df.columns = df [df [0] == 'foo']
EK

Vấn đề với điều đó là có thể có nhiều hơn một hàng có giá trị "foo". Một cách giải quyết vấn đề đó là rõ ràng chọn hàng đầu tiên như vậy: df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]].
unutbu

Ah tôi hiểu tại sao bạn làm như vậy. Đối với trường hợp của tôi, tôi biết chỉ có một hàng có giá trị "foo". Vì vậy, nó là ok. Mình vừa làm theo cách này chắc cũng giống như cách bạn đưa ra ở trên. idx_loc = df [df [0] == 'foo']. index.tolist () [0] df.columns = df.iloc [idx_loc]
EK

63

Điều này hoạt động (pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])

22
Bạn có thể xóa hàng "tiêu đề" bằng cách thêm.drop(df.index[0])
ostrokach.

Tôi thích điều này hơn câu trả lời được chấp nhận thực tế. Tôi thích các giải pháp một dòng ngắn gọn.
Javier

13

Sẽ dễ dàng hơn để tạo lại khung dữ liệu. Điều này cũng sẽ giải thích các loại cột từ đầu.

headers = df.iloc[0]
new_df  = pd.DataFrame(df.values[1:], columns=headers)

4

Bạn có thể chỉ định chỉ mục hàng trong các hàm tạo read_csv hoặc read_html thông qua headertham số đại diện Row number(s) to use as the column names, and the start of the data. Điều này có lợi thế là tự động loại bỏ tất cả các hàng trước đó được cho là rác.

import pandas as pd
from io import StringIO

In[1]
    csv = '''junk1, junk2, junk3, junk4, junk5
    junk1, junk2, junk3, junk4, junk5
    pears, apples, lemons, plums, other
    40, 50, 61, 72, 85
    '''

    df = pd.read_csv(StringIO(csv), header=2)
    print(df)

Out[1]
       pears   apples   lemons   plums   other
    0     40       50       61      72      85
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.