【问题标题】:split large csv based on one column condition and write to smaller csv根据一列条件拆分大 csv 并写入较小的 csv
【发布时间】:2019-04-17 13:46:06
【问题描述】:

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

非常感谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    或者,如果您的 Python 版本 .format 而非 f-string 进行字符串格式化:

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

    将我们的数据框拆分为单独的 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 
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 2018-11-29
        • 1970-01-01
        • 2017-10-10
        • 2019-06-14
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        相关资源
        最近更新 更多