【问题标题】:Split large csv file into several based on condition根据条件将大型 csv 文件拆分为多个
【发布时间】:2019-06-14 03:15:06
【问题描述】:

我有一个大的 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)):

【问题讨论】:

  • 文件有多大?它适合内存吗?
  • 既然用的是pandas,有没有试过DataFrame.groupby()
  • @NoufalIbrahim 是的,它适合内存,它不是太大..

标签: python csv split


【解决方案1】:

如果你想用pandas来做,那么线程Select rows from a DataFrame based on values in a column in pandas应该对你有帮助,尤其是unutbu的答案,它解释了.loc方法pandas.DataFrame的用法。

【讨论】:

  • 感谢您的链接,unubtu 的 回答真的很有帮助
【解决方案2】:

您可以使用collections.defaultdictZones 对行进行分组:

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])

【讨论】:

    【解决方案3】:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多