【问题标题】:How to split a dataframe by unique groups and save to a csv如何按唯一组拆分数据框并保存到 csv
【发布时间】:2014-11-24 01:39:15
【问题描述】:

我有一个想要迭代的 pandas 数据框。我的数据框的简化示例:

chr    start    end    Gene    Value   MoreData
chr1    123    123    HAPPY    41.1    3.4
chr1    125    129    HAPPY    45.9    4.5
chr1    140    145    HAPPY    39.3   4.1
chr1    342    355    SAD    34.2    9.0
chr1    360    361    SAD    44.3    8.1
chr1    390    399    SAD    29.0   7.2
chr1    400    411    SAD    35.6   6.5
chr1    462    470    LEG    20.0    2.7

我想遍历每个独特的基因并创建一个名为:

for Gene in df: ## this is where I need the most help

    OutFileName = Gene+".pdf"

对于上面的例子,我应该得到三个迭代,包含 3 个输出文件和 3 个数据帧:

# HAPPY.pdf
chr1    123    123    HAPPY    41.1    3.4 
chr1    125    129    HAPPY    45.9    4.5 
chr1    140    145    HAPPY    39.3   4.1

# SAD.pdf
chr1    342    355    SAD    34.2    9.0 
chr1    360    361    SAD  44.3    8.1 
chr1    390    399    SAD    29.0   7.2 
chr1    400    411    SAD    35.6   6.5

# Leg.pdf
chr1    462    470    LEG    20.0    2.7

按块分割的结果数据帧内容将被发送到另一个函数,该函数将执行分析并返回要写入文件的内容。

【问题讨论】:

    标签: python pandas dataframe csv


    【解决方案1】:

    您可以调用unique 获取唯一值,对其进行迭代,构建文件名并将其写入 csv:

    genes = df['Gene'].unique()
    for gene in genes:
        outfilename = gene + '.pdf'
        print(outfilename)
        df[df['Gene'] == gene].to_csv(outfilename)
    HAPPY.pdf
    SAD.pdf
    LEG.pdf
    

    一种更类似于 pandas 的方法是在 'Gene' 上进行分组,然后遍历这些组:

    gp = df.groupby('Gene')
    # groups() returns a dict with 'Gene':indices as k:v pair
    for g in gp.groups.items():
        print(df.loc[g[1]])   
        
        chr  start  end   Gene  Value  MoreData
    0  chr1    123  123  HAPPY   41.1       3.4
    1  chr1    125  129  HAPPY   45.9       4.5
    2  chr1    140  145  HAPPY   39.3       4.1
        chr  start  end Gene  Value  MoreData
    3  chr1    342  355  SAD   34.2       9.0
    4  chr1    360  361  SAD   44.3       8.1
    5  chr1    390  399  SAD   29.0       7.2
    6  chr1    400  411  SAD   35.6       6.5
        chr  start  end Gene  Value  MoreData
    7  chr1    462  470  LEG     20       2.7
    

    【讨论】:

      【解决方案2】:
      • 按列分组更简洁,然后将关联的组保存到 csv 文件。
        • 此解决方案只需要 2 行代码。
        • 可以在执行.groupby() 时或在循环内执行其他函数的聚合。
      • 在没有聚合的情况下使用时,pandas.DataFrame.groupby 返回与 groupby 列中每个唯一值关联的数据帧组件。
        • 以下代码中没有使用.groups.items():,这样可以方便地使用group作为文件名。
        • 以下代码将为与用于 groupby 的列中的每个唯一值关联的数据创建一个文件。
      • 使用f-strings 为每个group 创建一个唯一的文件名。
      import pandas as pd
      
      # create the dataframe
      data = {'chr': ['chr1', 'chr1', 'chr1', 'chr1', 'chr1', 'chr1', 'chr1', 'chr1'], 'start': [123, 125, 140, 342, 360, 390, 400, 462], 'end': [123, 129, 145, 355, 361, 399, 411, 470], 'Gene': ['HAPPY', 'HAPPY', 'HAPPY', 'SAD', 'SAD', 'SAD', 'SAD', 'LEG'], 'Value': [41.1, 45.9, 39.3, 34.2, 44.3, 29.0, 35.6, 20.0], 'MoreData': [3.4, 4.5, 4.1, 9.0, 8.1, 7.2, 6.5, 2.7]}
      df = pd.DataFrame(data)
      
      # groupby the desired column and iterate through the groupby object
      for group, dataframe in df.groupby('Gene'):
          
          # save the dataframe for each group to a csv
          dataframe.to_csv(f'{group}.csv', index=False)
      

      结果

      • HAPPY.csv
      chr,start,end,Gene,Value,MoreData
      chr1,123,123,HAPPY,41.1,3.4
      chr1,125,129,HAPPY,45.9,4.5
      chr1,140,145,HAPPY,39.3,4.1
      
      • SAD.csv
      chr,start,end,Gene,Value,MoreData
      chr1,342,355,SAD,34.2,9.0
      chr1,360,361,SAD,44.3,8.1
      chr1,390,399,SAD,29.0,7.2
      chr1,400,411,SAD,35.6,6.5
      
      • LEG.csv
      chr,start,end,Gene,Value,MoreData
      chr1,462,470,LEG,20.0,2.7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-01
        • 2022-07-15
        • 2020-01-15
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 2018-03-16
        • 2020-12-03
        相关资源
        最近更新 更多