2016-08-03 12 views
2

ich einen Beispieldatensatz habe:Gruppe und Ausgabe auf Teilspaltenwert 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) 

es wie folgt aussieht:

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 

ich will Spalte ‚VG‘ GROUPBY aber nur den Teil vor '*' für jede Zeile, und gruppieren Sie dann um die gleichen Werte und geben Sie sie in separaten Dateien aus.

mein Konzept ist:

  1. Gruppe der Datensatz ‚df‘ durch Spalte
  2. ‚VG‘ für jede Zeile der Spalte ‚VG‘ Blick auf nur den Teil vor dem ‚*‘, z.B. "LV5-F", "LV5-A", "LV5-D" usw.
  3. gruppieren Sie das Dataset noch einmal, aber dieses Mal für die gleichen Werte aus Schritt 2
  4. geben Sie jedes unterschiedliche gruppierte Set in eine separate Datei aus .

Wunsch Ausgabe, einzelne separate Dateien:

'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 

mein Versuch:

(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)) 
) 

aber am failed '.apply (lambda x: re.findall (' ([0 -9A-Z -] +) * ', x)' Schritt und ich bin mir nicht sicher, warum es nicht funktioniert, denn wenn ich diesen Code von selbst ohne im Zusammenhang mit einer Lambda-Funktion lief, hat es funktioniert.

Antwort

2

Y Sie müssen die Funktion unter to_csv an Ihre Bedürfnisse anpassen. Insbesondere, anstatt zu drucken, geben Sie einfach einen Dateinamen ein.

Aber ich würde es auf diese Weise strukturieren:

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 
+0

Ich habe einen Fehler: ‚Typeerror: extract() hat ein unerwartetes Schlüsselwort-Argument 'expand' erhalten, auch warum enthält die von Ihnen angezeigte Ausgabe Kommas? Gibt es eine Möglichkeit, die gewünschte Ausgabe zu erzeugen? – Jessica

+0

@Jessica dieses Argument fallen lassen. Es wird sich beschweren, wenn Sie es nicht in Pandas Version 0.18.1 haben. Zuvor beschwert es sich, dass Sie es überhaupt haben. – piRSquared

+0

können Sie mir den Regex-Teil erklären? r '^ ([^ \ *] +) Danke – Jessica

1

ich meinen Code mit Hilfe von @piRSquared geändert und es funktionierte:

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