我想要做的是我有一个很大的.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
答案 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
轻松实现这一目标。
导入样本数据
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