簡體   English   中英

分組並輸出部分列值pandas python

[英]group and output on partial column value pandas python

我有一個樣本數據集:

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. 將數據集“ df”按列“ VG”分組
  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函數,但效果很好。

您必須調整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

我在@piRSquared的幫助下修改了我的代碼,它起作用了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM