Xóa cột chỉ mục trong gấu trúc khi đọc csv


128

Tôi có đoạn mã sau đây nhập tệp CSV. Có 3 cột và tôi muốn đặt hai trong số chúng thành các biến. Khi tôi đặt cột thứ hai thành biến "hiệu quả", cột chỉ mục cũng được xử lý. Làm thế nào tôi có thể thoát khỏi cột chỉ số?

df = pd.DataFrame.from_csv('Efficiency_Data.csv', header=0, parse_dates=False)
energy = df.index
efficiency = df.Efficiency
print efficiency

Tôi đã thử sử dụng

del df['index']

sau khi tôi đặt

energy = df.index

mà tôi đã tìm thấy trong một bài đăng khác nhưng kết quả là "KeyError: 'index'"

Câu trả lời:


70

DataFramesSeries luôn có một chỉ mục. Mặc dù nó hiển thị dọc theo (các) cột, nhưng nó không phải là một cột, đó là lý do tại sao del df['index']nó không hoạt động.

Nếu bạn muốn thay thế chỉ mục bằng các số tuần tự đơn giản, hãy sử dụng df.reset_index().

Để hiểu được lý do tại sao chỉ mục lại ở đó và cách sử dụng nó, hãy xem, ví dụ 10 phút đến Pandas .


1
Cảm ơn! Tôi quyết định chỉ nhập nó theo một cách khác không sử dụng gấu trúc. Tôi phải thực hiện một số số học trên mỗi cột và python không thích có cột chỉ mục được đính kèm. Pandas chắc chắn là cách dễ nhất để nhập dữ liệu nhưng không phải lúc nào cũng tốt nhất tôi tìm ra.
Bogdan Janiszewski

2
Bạn đã thử sử dụng Pandas để làm số học?
Jamie Bull

1
người ta có thể loại bỏ tên chỉ mục?
Quant

3
Vâng, index.name = None.
Dan Allan

1
@BogdanJaniszewski, nếu bạn không sử dụng gấu trúc, vậy tại sao bạn lại chấp nhận đây là câu trả lời?
đa cấp

249

Khi đọc đến và từ tệp CSV của bạn, hãy bao gồm đối số index=False, ví dụ:

 df.to_csv(filename, index=False)

và đọc từ csv

df.read_csv(filename, index=False)  

Điều này sẽ ngăn vấn đề vì vậy bạn không cần phải sửa nó sau.


8
Cảm ơn rất nhiều. Đây chính xác là câu hỏi đang tìm kiếm.
Pale Blue Dot

1
"Tiêu đề = Sai" hoạt động để xóa các tiêu đề theo cùng một cách
J.Dahlgren

29
nên index_col=False.
Vedda

1
Việc sử dụng df.to_sql("table",cursor,if_exists="append",index=False)cũng khắc phục lỗi sqlitesqlite3.OperationalError: table message has no column named index
Anna

1
@vedda nó dường như index=Falsedành cho to_excel()index_col=Falsevới read_csv()gấu trúc 0.23.4. : - /
matt wilkie

70

df.reset_index(drop=True, inplace=True)


2
Đây thực sự là giải pháp yêu thích của tôi, nhưng không phải là một câu trả lời rất công phu. Hướng dẫn đọc điều này về đối số drop: "Đừng cố chèn chỉ mục vào các cột khung dữ liệu. Điều này đặt lại chỉ mục về chỉ mục số nguyên mặc định." pandas.pydata.org/pandas-docs/urdy/generated/ từ
tommy.carstensen

@ tommy.carstensen Sau đó, làm thế nào bạn có thể tránh việc lấy các số nguyên trên chỉ mục làm thay thế cho chỉ mục trước đó? Tôi nghĩ đó là một sự hiểu lầm về văn bản liên kết của bạn. Câu hỏi ở đây là bỏ chỉ số . Và điều này đạt được ở đây. Bạn nhận được các số nguyên mặc định, vì không có khung ngày mà không có chỉ mục, nhưng bạn đã bỏ chỉ mục trước đó. Đó là lý do tại sao câu trả lời này phải là câu trả lời được chấp nhận, cũng bởi vì nó sử dụng bộ nhớ hiệu quả inplace=True.
Lorenz

13

Bạn có thể đặt một trong các cột làm chỉ mục trong trường hợp đó là "id" chẳng hạn. Trong trường hợp này, cột chỉ mục sẽ được thay thế bằng một trong các cột bạn đã chọn.

df.set_index('id', inplace=True)

3

Nếu vấn đề của bạn giống như của tôi, nơi bạn chỉ muốn đặt lại các tiêu đề cột từ 0 đến kích thước cột. Làm

df = pd.DataFrame(df.values);

BIÊN TẬP:

Không phải là một ý tưởng tốt nếu bạn có các loại dữ liệu không đồng nhất. Tốt hơn chỉ nên sử dụng

df.columns = range(len(df.columns))

2

bạn có thể chỉ định cột nào là chỉ mục trong tệp csv của mình bằng cách sử dụng tham số index_col của hàm from_csv nếu điều này không giải quyết được vấn đề của bạn, vui lòng cung cấp ví dụ về dữ liệu của bạn


2

Một điều mà tôi làm là df=df.reset_index() sau đódf=df.drop(['index'],axis=1)


Lỗi: "nhãn ['index'] không được chứa trong trục"
Vasin Yuriy

@VasinYuriy điều này có nghĩa là df.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex']), nó chỉ hoạt động với 'index' trong trường hợp tiêu chuẩn mà chỉ mục không có tên và sau đó trở thành một cột có tên là 'index' với df.reset_index().drop(columns=['index']). Tham số được thêm vào axis=1là mặc định. Phương pháp này không được khuyến nghị, @ SubhojitMukherjee reset_index(inplace=True)hoạt động "tại chỗ" và do đó tiết kiệm bộ nhớ.
Lorenz
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.