【问题标题】:group and output on partial column value pandas python对部分列值pandas python进行分组和输出
【发布时间】:2016-08-03 18:38:48
【问题描述】:

我有一个样本数据集:

import pandas as pd
import re

df = {'READID': [1,2,3  ,4,5    ,6,7    ,8,9],
  'VG': ['LV5-F*01','LV5-F*01'  ,'LV5-A*02','LV5-D*01','LV5-E*01','LV5-C*01','LV5-D*01','LV5-E*01','LV5-F*01'],
  'Pro': [1,1,1,0.33,0.59,1,0.96,1,1]}

df = pd.DataFrame(df)

看起来像这样:

df
Out[12]: 
     Pro    READID        VG
0   1.00       1      LV5-F*01
1   1.00       2      LV5-F*01
2   1.00       3      LV5-A*02
3   0.33       4      LV5-D*01
4   0.59       5      LV5-E*01
5   1.00       6      LV5-C*01
6   0.96       7      LV5-D*01
7   1.00       8      LV5-E*01
8   1.00       9      LV5-F*01

我想对列“VG”进行分组,但只对每行的“*”之前的部分进行分组,然后按相同的值分组并将它们输出到单独的文件中。

我的概念是:

  1. 按列“VG”对数据集“df”进行分组
  2. 对于列“VG”的每一行,只查看“*”之前的部分,例如'LV5-F'、'LV5-A'、'LV5-D'等。
  3. 再次对数据集进行分组,但这次使用第 2 步中的相同值
  4. 将每个不同的分组集输出到单独的文件中。

希望输出,单独的单独文件:

'LV5-F.txt':
     Pro    READID        VG
0   1.00       1      LV5-F*01
1   1.00       2      LV5-F*01
8   1.00       9      LV5-F*01


'LV5-A.txt':
     Pro    READID        VG
2   1.00       3      LV5-A*02


'LV5-D.txt':
     Pro    READID        VG
3   0.33       4      LV5-D*01
6   0.96       7      LV5-D*01


'LV5-E.txt':
     Pro    READID        VG
4   0.59       5      LV5-E*01
7   1.00       8      LV5-E*01


'LV5-C.txt':
    Pro    READID        VG
5   1.00       6      LV5-C*01

我的尝试:

(df.groupby('VG')
   .apply(lambda x: re.findall('([0-9A-Z-]+)\*',x) )
   .groupby('VG')
   .apply(lambda gp: gp.to_csv('{}.txt'.format(gp.name), sep='\t',   index=False))
 )

但它在 '.apply(lambda x: re.findall('([0-9A-Z-]+)*',x)' 步骤失败了,我不确定为什么它不起作用因为当我在不作为 lambda 函数的情况下单独运行该代码时,它运行良好。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您必须调整to_csv 下方的功能以满足您的需求。特别是,不要打印,只需以某种方式提供文件名。

    但我会这样安排:

    def to_csv(df):
        print df.to_csv()
    
    #    extract
    #     within
    #     parens
    #    /------\
    # r'^([^\*]+)'
    #   ^ \----/
    #   |   \__________________________
    # match       |          |         |
    # beginning  [^this]    \*        '+'
    # of string  matches   have to    match
    #            not this  escape *   one or more
    #
    df.groupby(df.VG.str.extract(r'^([^\*]+)', expand=False)).apply(to_csv)
    
    ,Pro,READID,VG
    2,1.0,3,LV5-A*02
    
    ,Pro,READID,VG
    2,1.0,3,LV5-A*02
    
    ,Pro,READID,VG
    5,1.0,6,LV5-C*01
    
    ,Pro,READID,VG
    3,0.33,4,LV5-D*01
    6,0.96,7,LV5-D*01
    
    ,Pro,READID,VG
    4,0.59,5,LV5-E*01
    7,1.0,8,LV5-E*01
    
    ,Pro,READID,VG
    0,1.0,1,LV5-F*01
    1,1.0,2,LV5-F*01
    8,1.0,9,LV5-F*01
    

    【讨论】:

    • 我得到一个错误:'typeError: extract() got an unexpected keyword argument 'expand',为什么你显示的输出包含逗号?有没有办法产生我想要的输出?
    • @Jessica 放弃这个论点。如果您在 pandas 0.18.1 版中没有它,它会抱怨。在此之前,它抱怨你根本没有。
    • 你能向我解释一下正则表达式部分吗? r'^([^*]+)' 谢谢
    【解决方案2】:

    我在@piRSquared 的帮助下修改了我的代码,它成功了:

    df.groupby(df.VG.str.extract(r'^([^\*]+)')).apply(lambda gp: gp.to_csv('{}.txt'.format(gp.name), sep='\t', index=False))
    

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 2021-10-30
      • 2015-10-06
      • 2020-02-13
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2017-12-29
      相关资源
      最近更新 更多