pandas DataFrame에서 "Unnamed : 0"열을 제거하는 방법은 무엇입니까?


152

때때로 csv에서 읽을 때 df원하지 않는 인덱스와 같은 열을 얻는 상황이 있습니다 unnamed:0.

file.csv

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

CSV는 다음과 같이 읽습니다.

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

이것은 매우 성가시다! 누구든지 이것을 제거하는 방법에 대한 아이디어가 있습니까?

답변:


186

색인 열이므로 index=False쓰지 말고 전달 하십시오. 문서를 참조하십시오.

예:

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

와 비교 :

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

다음 read_csv을 전달하여 첫 번째 열이 인덱스 열임을 선택적으로 알 수도 있습니다 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

다른 곳에서 얻은 데이터 세트에는 이미이 열이 포함되어 있기 때문에 올바른 매개 변수를 사용하여 "올바른"데이터 세트를 생성하는 방법을 이해하는 데 실제로 도움이되지 않습니다. 이 열이 이미있을 때로 드 할 때이 열을 제거하는 방법이 있습니까?
Calvin Ku

2
@CalvinKu 불행히도에 대한 skipcols인수 가 없습니다 .CSV read_csv에서 읽은 후에는 할 수 df = df.drop(columns=df.columns[0])있거나 먼저 열을 읽은 다음 열을 빼고 첫 번째 열을 빼고 cols = pd.read_csv( ....., nrows=1).columns다시 읽습니다. df = pd.read_csv(....., usecols=cols[1:])이는 읽기 의 오버 헤드를 피합니다 불필요한 열을

43

이 문제는 CSV가 RangeIndex일반적으로 이름이없는 CSV와 함께 저장 되었기 때문에 나타납니다 . 수정은 실제로 DataFrame을 저장할 때 수행해야하지만 항상 옵션은 아닙니다.

문제를 회피 : read_csvindex_col 인수

IMO에서 가장 간단한 해결책은 명명되지 않은 열을 index 로 읽는 것 입니다. 에 index_col=[0]인수를 지정하면 pd.read_csv첫 번째 열에서 색인으로 읽습니다.

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

참고 DataFrame에 시작할 색인이없는 경우 출력 CSV를 작성할 때
사용하여 처음부터이를 피할 수있었습니다 index=False.

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

그러나 위에서 언급했듯이 이것이 항상 옵션은 아닙니다.


Stopgap 솔루션 : 필터링 str.match

CSV 파일을 읽기 / 쓰기 할 수있는 코드를 수정할 수없는 경우, 당신은 할 수 필터링하여 열을 제거 하여 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
고마워요! 이 index_col=[0]수정은 'unnamed : 0'이라는이 성가신 문제를 쉽게 해결했으며 바퀴를 재창조하는 자세한 코드를 작성했습니다.
user48115

1
명명되지 않은 열을 사용하려면 다음과 같은 정규식을 사용할 수도 있습니다.df.drop(df.filter(regex="Unname"),axis=1, inplace=True)
Sarah

8

이 문제가 발생할 수있는 또 다른 경우 csv는 각 행이 쉼표로 끝나도록 데이터가 잘못 기록 된 경우 입니다. 이렇게하면 Unnamed: x데이터를 읽을 때 데이터 끝에 이름이없는 열이 남습니다 df.


2
나는 usecols=range(0,10)이름이없는 열을 잘라내었다
Nash

8

모든 명명되지 않은 열을 사용하려면 다음과 같은 정규식을 사용할 수도 있습니다. df.drop(df.filter(regex="Unname"),axis=1, inplace=True)


2

다음을 사용하여 해당 열을 삭제하십시오. del df['column_name']

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.