팬더 read_csv 및 usecols로 열 필터링
여러 곳에서 pandas.read_csv
열을 필터링 usecols
하고 사용할 때 사용하는 곳 이없는 csv 파일이 있습니다.
import pandas as pd
csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""
f = open('foo.csv', 'w')
f.write(csv)
f.close()
df1 = pd.read_csv('foo.csv',
header=0,
names=["dummy", "date", "loc", "x"],
index_col=["date", "loc"],
usecols=["dummy", "date", "loc", "x"],
parse_dates=["date"])
print df1
# Ignore the dummy columns
df2 = pd.read_csv('foo.csv',
index_col=["date", "loc"],
usecols=["date", "loc", "x"], # <----------- Changed
parse_dates=["date"],
header=0,
names=["dummy", "date", "loc", "x"])
print df2
df1과 df2는 누락 된 더미 열을 제외하고 동일해야하지만 열에 레이블이 잘못 지정되어 있습니다. 또한 날짜는 날짜로 구문 분석됩니다.
In [118]: %run test.py
dummy x
date loc
2009-01-01 a bar 1
2009-01-02 a bar 3
2009-01-03 a bar 5
2009-01-01 b bar 1
2009-01-02 b bar 3
2009-01-03 b bar 5
date
date loc
a 1 20090101
3 20090102
5 20090103
b 1 20090101
3 20090102
5 20090103
이름 대신 열 번호를 사용하면 동일한 문제가 발생합니다. read_csv 나중에 더미 열을 삭제하여 문제를 해결합니다. pandas 0.10.1을 사용하고 있습니다.
편집 : 잘못된 헤더 사용 수정.
@chip의 대답은 두 개의 키워드 인수의 요점을 완전히 놓쳤습니다.
- 이름 은 헤더가 아닌 열 이름을 사용하여 다른 인수를 지정하려는 경우에만합니다.
- usecols 는 전체 DataFrame을 메모리로 읽기 전에 필터를 제공해야합니다. 읽은 후 열을 사용하면 읽지 않습니다.
이 솔루션은이 점이 이상한 점을 수정합니다.
import pandas as pd
from StringIO import StringIO
csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""
df = pd.read_csv(StringIO(csv),
header=0,
index_col=["date", "loc"],
usecols=["date", "loc", "x"],
parse_dates=["date"])
이것은 우리에게 다음을 제공합니다.
x
date loc
2009-01-01 a 1
2009-01-02 a 3
2009-01-03 a 5
2009-01-01 b 1
2009-01-02 b 3
2009-01-03 b 5
이 코드는 당신이 원하는 것을 달성합니다 --- 또한 이상하고 확실히 버그가 있습니다.
나는 다음과 같은 경우에 발광한다는 것을 관찰했습니다.
a) 상대를 지정합니다 index_col
. 실제로 사용하는 열 수에 따라-이 예에서는 4 개가 아닌 3 개 열 ( dummy
그때부터 삭제 하고 계산을 시작합니다)
b) 동일 parse_dates
c) 않다 usecols
;) 명백한 M
d) 여기서 나는 names
이 행동을 반영 하도록했습니다.
import pandas as pd
from StringIO import StringIO
csv = """dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5
"""
df = pd.read_csv(StringIO(csv),
index_col=[0,1],
usecols=[1,2,3],
parse_dates=[0],
header=0,
names=["date", "loc", "", "x"])
print df
어느 인쇄
x
date loc
2009-01-01 a 1
2009-01-02 a 3
2009-01-03 a 5
2009-01-01 b 1
2009-01-02 b 3
2009-01-03 b 5
CSV에 추가 데이터 파일가 포함 된 경우 가져온 후 DataFrame에서 열을 삭제할 수 있습니다 .
import pandas as pd
from StringIO import StringIO
csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""
df = pd.read_csv(StringIO(csv),
index_col=["date", "loc"],
usecols=["dummy", "date", "loc", "x"],
parse_dates=["date"],
header=0,
names=["dummy", "date", "loc", "x"])
del df['dummy']
이것은 우리에게 다음을 제공합니다.
x
date loc
2009-01-01 a 1
2009-01-02 a 3
2009-01-03 a 5
2009-01-01 b 1
2009-01-02 b 3
2009-01-03 b 5
index_col=False
매개 변수 만 추가하면 됩니다.
df1 = pd.read_csv('foo.csv',
header=0,
index_col=False,
names=["dummy", "date", "loc", "x"],
index_col=["date", "loc"],
usecols=["dummy", "date", "loc", "x"],
parse_dates=["date"])
print df1
먼저 csv를 가져오고 csv.DictReader를 사용하여 처리하기 쉽습니다.
참고 URL : https://stackoverflow.com/questions/15017072/pandas-read-csv-and-filter-columns-with-usecols
'IT' 카테고리의 다른 글
Java 애플리케이션 당 하나의 JVM이 있습니까? (0) | 2020.10.10 |
---|---|
포함 () 연산자가 Entity Framework의 성능을 향상시키는 이유는 무엇입니까? (0) | 2020.10.10 |
CLOSE_WAIT 소켓 연결을 제거하는 방법 (0) | 2020.10.10 |
Flexbox 레이아웃이 100 % 수직 공간을 차지하게해야합니까? (0) | 2020.10.10 |
EQATEC 약력 러로 ASP.NET 웹 사이트 약력 링 (0) | 2020.10.10 |