如何在不使用for循环的情况下搜索一个csv文件的常用记录到另一个csv文件

时间:2015-11-17 12:53:39

标签: python file csv records

我想要做的是我有一个很大的.csv文件。我想根据BB列中的常见记录将这个大csv文件分解为许多小文件,这些记录在HH列中也包含1,以及在HH列中包含0的所有非常见记录。

因此,所有文件都将包含BB列中的公共记录,其中HH列中包含1,并且所有不常见的记录在BB列中没有记录,并且在HH列中包含0。文件名应基于第2列(BB)的通用记录。请看下面的情景。

bigFile.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      53     115       10     3       3     186     1
   12      53     01e       23     3       2             1
   12      53     0ce       65     1       3             1
   12      53     173       73     4       2             1
   12      59     115       0      3       3     186     1
   12      59     125       0      3       3     186     1
   12      61     01e       23     3       2             1
   12      61     b6f       0      1       1             1
   12      61     b1b       0      6       5     960     1
   12             68b       95     3       5     334     0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4     215     0
   12             a10       36     5       1             0      

我的预期结果文件如下:

53.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      53     115       10     3       3     186     1
   12      53     01e       23     3       2             1
   12      53     0ce       65     1       3             1
   12      53     173       73     4       2             1
   12             68b       95     3       5     334     0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4     215     0
   12             a10       36     5       1             0      

59.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      59     115       0      3       3     186     1
   12      59     125       0      3       3     186     1
   12             68b       95     3       5     334     0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4     215     0
   12             a10       36     5       1             0      

61.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      61     01e       23     3       2             1
   12      61     b6f       0      1       1             1
   12      61     b1b       0      6       5    960      1
   12             68b       95     3       5    334      0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4    215      0
   12             a10       36     5       1             0      

2 个答案:

答案 0 :(得分:2)

以下脚本将产生您的预期结果。它根据第一行的内容过滤文件:

import csv

with open('123.csv', 'r') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)

    header = next(csv_input)
    first_row = next(csv_input)

    csv_output.writerow(header)
    csv_output.writerow(first_row)

    for row in csv_input:
        if row[0] == first_row[0]:
            if row[1] == first_row[1] or row[7] == '0':
                csv_output.writerow(row)

要对同一文件夹中的所有CSV文件执行此操作,可以使用以下命令:

import glob             
import csv
import os

file_list = glob.glob('*.csv')

output_folder = 'temp'  # make sure this folder exists

for file in file_list:
    file_name = os.path.join(output_folder, os.path.basename(file))
    with open(file, 'r') as f_input, open(file_name, 'w', newline='') as f_output:
        csv_input = csv.reader(f_input)
        csv_output = csv.writer(f_output)

        header = next(csv_input)
        first_row = next(csv_input)

        csv_output.writerow(header)
        csv_output.writerow(first_row)

        for row in csv_input:
            if row[0] == first_row[0]:
                if row[1] == first_row[1] or row[7] == '0':
                    csv_output.writerow(row)

这会将所有输出文件写入temp文件夹。

答案 1 :(得分:0)

您似乎正在尝试删除conv_id中包含5093,51206的行。

您可以使用pandas轻松实现这一目标。

导入样本数据

StringIO模拟使用read_csv

import pandas as pd
from io import StringIO # only for this example

data = """
adv_id,conv_id,user_id,dwell,sessions
123,50381,4e06,0,3
123,50381,454b,0,239
123,50983,4e06,0,3
123,50983,454b,0,239
123,51026,454b,0,239
123,maf98,45eb,0,1
"""

# Start here
df = pd.read_csv(StringIO(data), delimiter=',')

这会导致df

   adv_id conv_id user_id  dwell  sessions
0     123   50381    4e06      0         3
1     123   50381    454b      0       239
2     123   50983    4e06      0         3
3     123   50983    454b      0       239
4     123   51026    454b      0       239
5     123   maf98    45eb      0         1

过滤掉值

要删除不需要的行,我们可以使用isin提取包含这些值的行:

idx = df['conv_id'].isin(['50983','51026'])
df = df[~idx]
# the ~ means to exclude those values

这将导致:

   adv_id conv_id user_id  dwell  sessions
0     123   50381    4e06      0         3
1     123   50381    454b      0       239
5     123   maf98    45eb      0         1