Разделить большой CSV-файл на несколько в зависимости от условий - PullRequest
0 голосов
/ 20 января 2019

У меня есть один большой 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)):

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Вы можете использовать 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])
0 голосов
/ 20 января 2019

С Миллером (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
0 голосов
/ 20 января 2019

Если вы хотите сделать это, используя pandas, тогда поток Выбор строк из DataFrame на основе значений в столбце в pandas должен быть вам полезен, особенно ответ unutbu, который объясняет использование .loc метод pandas.DataFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...