IT

팬더 read_csv 및 usecols로 열 필터링

lottoking 2020. 10. 10. 10:25

팬더 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