web-dev-qa-db-ja.com

Python Pandas read_csv行をスキップしますが、ヘッダーは保持します

Csvファイルでn行をスキップする方法を理解するのに問題がありますが、1行であるヘッダーを保持します。

私がやりたいのは、繰り返しですが、ヘッダーを最初の行から保持します。 skiprowsは、ヘッダーをスキップされた行の後の最初の行にします。これを行う最善の方法は何ですか?

data = pd.read_csv('test.csv', sep='|', header=0, skiprows=10, nrows=10)
60
mcd

行番号のリストを整数ではなくskiprowsに渡すことができます。

関数に整数10を指定すると、最初の10行がスキップされます。

最初の行0を(ヘッダーとして)保持し、行10までの他のすべてをスキップするには、次のように記述できます。

pd.read_csv('test.csv', sep='|', skiprows=range(1, 10))

read_csvを使用して行をスキップする他の方法

read_csvが使用する行を制御する2つの主な方法は、headerまたはskiprowsパラメーターです。

次の1列のCSVファイルがあるとします。

a
b
c
d
e
f

以下の各例では、このファイルはf = io.StringIO("\n".join("abcdef"))です。

  • すべての行を値として読み取ります(ヘッダーなし、デフォルトは整数)

    >>> pd.read_csv(f, header=None)
       0
    0  a
    1  b
    2  c
    3  d
    4  e
    5  f
    
  • 特定の行をヘッダーとして使用します(その前のすべての行をスキップします)。

    >>> pd.read_csv(f, header=3)
       d
    0  e
    1  f
    
  • MultiIndexを作成するヘッダーとして複数の行を使用します(最後に指定されたヘッダー行の前のすべての行をスキップします)。

    >>> pd.read_csv(f, header=[2, 4])                                                                                                                                                                        
       c
       e
    0  f
    
  • ファイルの先頭からN行をスキップします(スキップされない最初の行はヘッダーです):

    >>> pd.read_csv(f, skiprows=3)                                                                                                                                                                      
       d
    0  e
    1  f
    
  • 行インデックスを指定して1つ以上の行をスキップします(スキップされない最初の行はヘッダーです)。

    >>> pd.read_csv(f, skiprows=[2, 4])                                                                                                                                                                      
       a
    0  b
    1  d
    2  f
    
85
Alex Riley

すでに素晴らしい答え..ここに一般化されたフォームを追加する必要性をどうにか感じます。このシナリオを考慮してください:-

Xls/csvの上位2行(行#0,1)にジャンク行があるとします。行#2(3行目)が実際のヘッダーであり、行#50(つまり51行目)から始まる10行をロードする必要があります。スニペットは次のとおりです。

pd.read_csv('test.csv', header=2, skiprows=range(3, 50), nrows=10)

6
Zakir

@AlexRileyの答えを拡張するために、skiprows引数は、スキップする行を決定する数値のリストを取ります。そう:

pd.read_csv('test.csv', sep='|', skiprows=range(1, 10))

以下と同じです:

pd.read_csv('test.csv', sep='|', skiprows=[1,2,3,4,5,6,7,8,9])

特定の行を無視する最善の方法は、(手動で、または整数のリストを返すrangeなどの関数を使用して)無視リストを作成し、skiprowsに渡すことです。

3
Prateek Khatri

長いcsvファイルを繰り返し処理する場合は、 chunksize 引数を使用できます。何らかの理由で手動でステップスルーする必要がある場合は、反復処理の回数を知っている限り、以下を試すことができます。

for i in range(num_iters):
    pd.read_csv('test.csv', sep='|', header=0, 
                 skiprows = range(i*10 + 1, (i+1)*10), nrows=10)
1
JohnM

特定の行をスキップ/ドロップする必要がある場合は、最初の3行(つまり、0,1,2)、さらに2行(つまり、4,5)を言います。次を使用して、ヘッダー行を保持できます。

df = pd.read_csv(file_in, delimiter='\t', skiprows=[0,1,2,4,5], encoding='utf-16', usecols=cols)
0
Lawrence Jacob