我有一个csv文件,像这样:
Account Email User_Id User Type Base Role Last Login
123456 x@proton.com 111111 inter user 7
7891011 y@proton.com 222222 inter user 6
121314 z@proton.com 333333 inter user 5
,还有50个这样的行。每个帐户可以有多个用户。而且同一个账户可以在文件中多次出现。我必须为每个帐户创建一个新的csv文件。对于每个帐户,我必须选择整个行并复制其内容。我该怎么做呢?如何选择:
for each account number
if a csv file for this account does not exist already
create a new file
copy the entire now and paste it in the new csv file
我可以这样创建一个新的csv文件:
with open("test.csv") as fp
,但我被困在我如何去选择每个帐号,然后复制和粘贴该行的内容在一个新的文件。我是Python的新手。请帮助
你可以在python中使用pandas
import pandas as pd
如果你有DataFrame ->它好
如果没有,可以使用这一行将CSV转换为DataFrame
df = pd.read_csv('your_csv_file.csv')
现在你可以像这样使用DataFrame函数来选择你的数据。
new_df = df.loc[df['Account'] == 123456]
new_df也是一个数据框架。您可以使用以下命令保存结果DataFrame:
new_df.to_csv('results.csv')
您可以使用以下代码对每个帐号执行此操作:
for i in df['Account'] :
new_df = df.loc[df['Account'] == i]
# you can use list of file path for saving results
new_df.to_csv('results.csv')
Python默认自带csv
模块
import csv
def get_firsts(csvfile, skip_first=True):
with open(csvfile, 'r') as f:
data = csv.reader(f, delimiter=',')
if skip_first:
_ = next(data)
firsts = [row[0] for row in data]
return firsts
这将返回一个仅包含每行第一个元素的列表,如果第一个元素是列名,则可以去掉第一个元素。
您可以尝试使用convtools库,它提供了许多数据处理原语,包括聚合和CSV文件的帮助器:
from convtools import conversion as c
from convtools.contrib.tables import Table
dialect = Table.csv_dialect(delimiter="t")
# read the input file
table = Table.from_csv("input_1.csv", header=True, dialect=dialect)
# remember the header
header = table.columns
# prepare a converter to group by first column (we could work with dicts, but
# it is slower), aggregate by storing rows in arrays
converter = (
c.group_by(c.item(0))
.aggregate({"account": c.item(0), "rows": c.ReduceFuncs.Array(c.this())})
.gen_converter()
)
# perform aggregation
data_by_accounts = converter(table.into_iter_rows(list))
# write files
for data in data_by_accounts:
Table.from_rows(data["rows"], header=header).into_csv(
"account_{}.csv".format(data["account"]), dialect=dialect
)