2

2 行以上の空白行が新しいデータ セクションを表す .csv ファイルがあります。しかし、アプリオリに、各セクションに何行あるかはわかりません。pandas データ フレームを直接読み取り、最初の 2 行以上の空白行で停止する方法はありますか?

データは次のとおりです (Google トレンドの結果からの .csv ファイル。ここでは省略されています)。

Web Search interest: zts
Worldwide; 2004 - present

Interest over time
Week,zts
2004-01-04 - 2004-01-10,0
2004-01-11 - 2004-01-17,80


Top regions for zts
Region,zts
Slovakia,100
Slovenia,23


Top cities for zts
City,zts
Bratislava (Slovakia),100
Wroclaw (Poland),39



Top searches for zts
focus zts,100
ford zts,90



Rising searches for zts
2002 focus zts,Breakout
battery tester,Breakout

ここでcsv.reader()、すべての行を使用してループし、最初の列の日付正規表現に一致し、2 つの列を持つ行を保持します。しかし、これはハックのようです。

次のようなものを使用するとpandas.read_csv(input_file, header=4)(後で日付正規表現を使用して正しいセクションを見つけます)、最後のセクションに3つの列があると失敗します(ここではそうではありませんが、可能です)。

行数を事前に知らpandas.read_csv()なくても、最初のブロックの後に停止する方法はありますか? 理想的には、この .csv を 5 つのデータ フレーム (データ セクションごとに 1 つ) に解析したいと考えていますが、この時点では最初のセクションを取得できて満足しています。

4

2 に答える 2

1

これが実際の問題に対する私の解決策です。つまり、1 つの .csv ファイルを複数の .csv ファイルとして解釈し、パンダの外部でこの分割を行う必要があります。

import csv

section = 1
line = 1

output_root = 'C:/Users/richard/Downloads/out'
input_file = 'C:/Users/richard/Downloads/in.csv'

input = open(input_file, 'rb')
reader = csv.reader(input)

for row in reader:
    if any(row) & (line == 1):
        output_file = output_root + '_' + str(section) + '.csv'
        output = open(output_file, 'wb')
        writer = csv.writer(output)
        writer.writerow(row)
        line += 1
    elif any(row) & (line > 1):
        writer.writerow(row)
        line += 1
    elif (line > 1):
        output.close()
        section += 1
        line = 1

output.close()
input.close()
于 2013-08-28T16:59:31.877 に答える
1

正規表現も使用できます。このような状況では非常にうまく機能します。

import re
from cStringIO import StringIO

csv1 = """right,top,bottom
4,5,6
6,7,8
"""

csv2 = """up,down,left
1,2,3
7,6,5
"""

csv3 = """a,b,c
1,2,3
4,5,6
"""

join_n = randint(2, 6, size=2)
raw = [csv1, csv2, csv3]
csvs = []

for csv, n in zip(raw, join_n):
    csvs.append(csv + '\n' * n)

csvs.append(csv3)
csvs = ''.join(csvs)

splitsville = re.split('\n{2,}', csvs)

dfs = []

for sp in splitsville:
    dfs.append(read_csv(StringIO(sp)))


final_df = concat(dfs, axis=1)

print final_df

収量:

   right  top  bottom  up  down  left  a  b  c
0      4    5       6   1     2     3  1  2  3
1      6    7       8   7     6     5  4  5  6

注:必ずしもofを実行する必要はありませんが、多くの場合concat、ofを操作し続ける必要がないように、次のステップとして有用です。listDataFramelistDataFrame

于 2013-08-28T17:54:09.707 に答える