[英]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”列進行分組,但每行僅對“ *”之前的部分進行分組,然后按相同的值分組,並將它們輸出到單獨的文件中。
我的概念是:
期望輸出,單獨的單獨文件:
'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.