繁体   English   中英

根据一列条件拆分大型csv并写入较小的csv

[英]split large csv based on one column condition and write to smaller csv

如何根据更改一列(例如ID)来拆分具有多个列的大型csv? 这是一个例子:

import pandas as pd
from pandas.compat import StringIO
csvdata = StringIO("""ID,f1
1,3.2
1,4.3
1,10
7,9.1
7,2.3
7,4.4
""") 

df = pd.read_csv(csvdata, sep=",")
df

我的目的是将每个块保存在单独的csv中,其名称根据ID在循环中生成:

df_ID_1.csv

    ID f1
    1  3.2
    1  4.3
    1  10.0

df_ID_7.csv

    ID f1
    7  9.1
    7  2.3
    7  4.4

非常感谢你!

只需循环遍历这些ID,为每个ID创建一个切片的数据框,然后创建您的.csv文件

for id in df['ID'].unique():
    temp_df = df.loc[df['ID'] == id]
    file_name = "df_ID_{}".format(id)
    # make the path to where you want it saved
    file_path = "C:/Users/you/Desktop/" + file_name
    # write the single ID dataframe to a csv
    temp_df.to_csv(file_path)

您可以为此使用groupby方法,并访问每个单独的组,然后使用pandas.to_csv将其写入csv。

for _, r in df.groupby('ID'):
    r.to_csv(f'df_ID_{r.ID.iloc[0]}')

或者,如果您的Python版本<3.5,请使用.format而不是f-string进行字符串格式化:

for _, r in df.groupby('ID'):
    r.to_csv('df_ID_{}.csv'.format(r.ID.iloc[0]))

这将我们的数据帧拆分为单独的csv:
CSV的

我们使用的循环说明

for _, r in df.groupby('ID'):
    print(r, '\n')
    print(f'This is our ID {r.ID.iloc[0]}', '\n')

   ID    f1
0   1   3.2
1   1   4.3
2   1  10.0 

This is our ID 1 

   ID   f1
3   7  9.1
4   7  2.3
5   7  4.4 

This is our ID 7 

不使用Pandas:使用csv module读取文件,使用指定的排序,使用itertools模块的指定分组,遍历各组并写入新文件。

import itertools, csv

key = operator.itemgetter('ID')
# assumes csvdata is a filelike object (io.StringIO in OP's example)
reader = csv.DictReader(csvdata)
fields = reader.fieldnames
data = sorted(reader, key = key)
for key,group in itertools.groupby(data, key):
    with open(f'ID_{key}.csv', 'w')as f:
        writer = csv.DictWriter(f, fields)
        writer.writeheader()
        writer.writerows(group)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM