Làm cách nào để thoát khỏi cột Chưa đặt tên: 0 cột trong một DataFrame của gấu trúc?


152

Tôi có một tình huống trong đó đôi khi khi tôi đọc csvtừ dftôi nhận được một cột giống như chỉ mục không mong muốn được đặt tên unnamed:0.

file.csv

,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9

CSV được đọc với điều này:

pd.read_csv('file.csv')

   Unnamed: 0  A  B  C
0           0  1  2  3
1           1  4  5  6
2           2  7  8  9

Điều này rất khó chịu! Có ai có một ý tưởng về làm thế nào để thoát khỏi điều này?

Câu trả lời:


186

Đó là cột chỉ mục, vượt qua index=Falseđể không viết nó ra, xem tài liệu

Thí dụ:

In [37]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
pd.read_csv(io.StringIO(df.to_csv()))

Out[37]:
   Unnamed: 0         a         b         c
0           0  0.109066 -1.112704 -0.545209
1           1  0.447114  1.525341  0.317252
2           2  0.507495  0.137863  0.886283
3           3  1.452867  1.888363  1.168101
4           4  0.901371 -0.704805  0.088335

so sánh với:

In [38]:
pd.read_csv(io.StringIO(df.to_csv(index=False)))

Out[38]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

Bạn cũng có thể tùy ý nói read_csvrằng cột đầu tiên là cột chỉ mục bằng cách chuyển index_col=0:

In [40]:
pd.read_csv(io.StringIO(df.to_csv()), index_col=0)

Out[40]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

Rất nhiều lần các bộ dữ liệu bạn nhận được từ nơi khác đã chứa cột này vì vậy nó không thực sự giúp biết cách tạo ra tập dữ liệu "đúng" bằng cách sử dụng đúng tham số. Có cách nào để loại bỏ cột này khi bạn tải nó khi nó đã ở đó không?
Calvin Ku

2
@CalvinKu thật không may, không có skipcolstranh luận read_csv, sau khi đọc trong csv bạn chỉ có thể làm df = df.drop(columns=df.columns[0])hoặc bạn có thể đọc các cột trước và sau đó vượt qua các cột trừ đi cột đầu tiên giống như cols = pd.read_csv( ....., nrows=1).columnssau đó đọc lại df = pd.read_csv(....., usecols=cols[1:])điều này để tránh việc đọc lại một cột thừa và sau đó thả nó xuống
EdChum 24/03/18

42

Vấn đề này rất có thể là do các CSV của bạn đã được lưu cùng với nó RangeIndex(thường không có tên). Việc khắc phục thực sự cần phải được thực hiện khi lưu DataFrame, nhưng điều này không phải lúc nào cũng là một tùy chọn.

Tránh vấn đề: read_csvvới index_col tranh luận

IMO, giải pháp đơn giản nhất là đọc cột không tên làm chỉ mục . Chỉ định một index_col=[0]đối số pd.read_csv, điều này đọc trong cột đầu tiên là chỉ mục.

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

# Save DataFrame to CSV.
df.to_csv('file.csv')

pd.read_csv('file.csv')

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

# Now try this again, with the extra argument.
pd.read_csv('file.csv', index_col=[0])

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

Lưu ý
Bạn có thể tránh điều này ở nơi đầu tiên bằng cách sử dụng index=Falsekhi tạo CSV đầu ra, nếu DataFrame của bạn không có chỉ mục để bắt đầu.

df.to_csv('file.csv', index=False)

Nhưng như đã đề cập ở trên, điều này không phải lúc nào cũng là một lựa chọn.


Giải pháp Stopgap: Lọc với str.match

Nếu bạn không thể sửa đổi mã để đọc / ghi tệp CSV, bạn chỉ có thể xóa cột bằng cách lọc bằng str.match:

df 

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

df.columns
# Index(['Unnamed: 0', 'a', 'b', 'c'], dtype='object')

df.columns.str.match('Unnamed')
# array([ True, False, False, False])

df.loc[:, ~df.columns.str.match('Unnamed')]

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

1
Cảm ơn rất nhiều! Khắc index_col=[0]phục sự cố đó dễ dàng giải quyết vấn đề gây phiền nhiễu này là 'chưa được đặt tên: 0' và dự phòng mã từ verbose phát minh lại bánh xe.
dùng48115

1
Để có được các cột không tên, bạn cũng có thể sử dụng regex nhưdf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
Sarah

8

Một trường hợp khác có thể xảy ra là nếu dữ liệu của bạn được ghi không chính xác csvvào mỗi hàng để kết thúc bằng một dấu phẩy. Điều này sẽ để lại cho bạn một cột không tên Unnamed: xở cuối dữ liệu của bạn khi bạn cố đọc nó thành một df.


2
Tôi đã sử dụng usecols=range(0,10)để cắt cột không tên
Nash

8

Để có được tất cả các cột Chưa đặt tên, bạn cũng có thể sử dụng regex như df.drop(df.filter(regex="Unname"),axis=1, inplace=True)


2

Chỉ cần xóa cột đó bằng cách sử dụng: del df['column_name']

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.