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

时间:2019-04-17 13:46:06

标签: python pandas

如何基于更改一列(例如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

非常感谢您!

3 个答案:

答案 0 :(得分:2)

只需循环浏览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)

答案 1 :(得分:2)

您可以为此使用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's

我们使用的循环的

说明

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 

答案 2 :(得分:0)

不使用熊猫:使用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)