我有一个很大的csv文件,我想使用条件将其分成几个文件。
这是文件的摘录:
Well Zones Top Bottom
E18 A 4273714.58 412435.8397
E18 B 99966532.9 96167746.15
E18 C 48737298.05 9038801.616
E18 D 42762897.31 23612634.16
E22 A 706299.7065 0
E22 B 17639585.97 8763276.956
E22 C 7535182.443 756105.4564
E22 D 7858392.171 4359022.937
E22 A 202221.3273 0
E23 B 1876003.29 100344.7098
E23 C 39002827.89 32876455.8
E23 D 10856279.73 944615.8366
我需要做的是创建多个文件,每个文件只有一种“区域”,如下所示:
一个csv文件:
Well Zones Top Bottom
E18 A 4273714.58 412435.8397
E22 A 706299.7065 0
E22 A 202221.3273 0
另一个csv文件:
Well Zones Top Bottom
E18 B 99966532.9 96167746.15
E22 B 17639585.97 8763276.956
E23 B 1876003.29 100344.7098
在网上冲浪时,我发现只能根据行/行的数量将大文件拆分为不同的块...例如以下代码:
for i,chunk in enumerate(pd.read_csv(file, chunksize=3)):
答案 0 :(得分:1)
如果您想使用pandas
进行操作,则线程Select rows from a DataFrame based on values in a column in pandas应该对您有所帮助,尤其是unutbu
答案,它解释了{{ 1}}。
答案 1 :(得分:1)
使用出色的命令行实用工具Miller(http://johnkerl.org/miller/doc),非常简单
mlr --tsv --from input.csv put -q 'tee > "Zone_".$Zones.".csv", $*'
从(制表符分隔)开始
Well Zones Top Bottom
E18 A 4273714.58 412435.8397
E18 B 99966532.9 96167746.15
E18 C 48737298.05 9038801.616
E18 D 42762897.31 23612634.16
E22 A 706299.7065 0
E22 B 17639585.97 8763276.956
E22 C 7535182.443 756105.4564
E22 D 7858392.171 4359022.937
E22 A 202221.3273 0
E23 B 1876003.29 100344.7098
E23 C 39002827.89 32876455.8
E23 D 10856279.73 944615.8366
你有
$ cat Zone_A.csv
Well Zones Top Bottom
E18 A 4273714.58 412435.8397
E22 A 706299.7065 0
E22 A 202221.3273 0
$ cat Zone_B.csv
Well Zones Top Bottom
E18 B 99966532.9 96167746.15
E22 B 17639585.97 8763276.956
E23 B 1876003.29 100344.7098
$ cat Zone_C.csv
Well Zones Top Bottom
E18 C 48737298.05 9038801.616
E22 C 7535182.443 756105.4564
E23 C 39002827.89 32876455.8
$ cat Zone_D.csv
Well Zones Top Bottom
E18 D 42762897.31 23612634.16
E22 D 7858392.171 4359022.937
E23 D 10856279.73 944615.8366
答案 2 :(得分:0)
您可以使用collections.defaultdict
通过Zones
对行进行分组:
from collections import defaultdict
import csv
result = defaultdict(list)
_header, *data = csv.reader(open('filename.csv'))
for a, b, *c in data:
result[b].append([a, b, *c])
for a, b in result.items():
with open(f'zone_{a}.csv', 'w') as f:
write = csv.writer(f)
write.writerows([_header, *b])