如何在不使用for循环的情况下将一个csv文件的公共记录搜索到另一个csv文件
How to search for the common records of one csv file to another csv file without using for loop
我想要做的是我有一个很大的 .csv 文件。我想根据 BB 列中的常见记录(在 HH 列中也包含 1)以及所有在 HH 列中包含 0 的不常见记录,将这个大的 csv 文件分解成许多小文件。
因此,所有文件将包含 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
您似乎在尝试删除 conv_id
中包含 5093,51206
.
的行
您可以使用 pandas
轻松实现。
导入示例数据
StringIO
simulates the use of 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
以下脚本将产生您预期的结果。它根据第一行的内容过滤文件:
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
文件夹。
我想要做的是我有一个很大的 .csv 文件。我想根据 BB 列中的常见记录(在 HH 列中也包含 1)以及所有在 HH 列中包含 0 的不常见记录,将这个大的 csv 文件分解成许多小文件。
因此,所有文件将包含 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
您似乎在尝试删除 conv_id
中包含 5093,51206
.
您可以使用 pandas
轻松实现。
导入示例数据
StringIO
simulates the use of 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
以下脚本将产生您预期的结果。它根据第一行的内容过滤文件:
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
文件夹。