2016-04-05 7 views

Antwort

1

Versuchen Sie folgendes:

In [175]: df.replace({'DSFS': {r'(\d+)\s*\-\s*(\d+)': r'\1_\2'}}, regex=True) 
Out[175]: 
    MemberID Year   DSFS DrugCount 
0 48925661 Y2 9_10 months  7+ 
1 90764620 Y3 8_9 months   3 
2 61221204 Y1 2_3 months   1 

Anstelle:

In [176]: df 
Out[176]: 
    MemberID Year   DSFS DrugCount 
0 48925661 Y2 9-10 months  7+ 
1 90764620 Y3 8- 9 months   3 
2 61221204 Y1 2- 3 months   1 

In [177]: df.replace({'DSFS': {r'(\d+)\s*\-\s*(\d+)': r'\1_\2'}}, regex=True, inplace=True) 

In [178]: df 
Out[178]: 
    MemberID Year   DSFS DrugCount 
0 48925661 Y2 9_10 months  7+ 
1 90764620 Y3 8_9 months   3 
2 61221204 Y1 2_3 months   1 

Wenn Sie nur Zahlen erhalten möchten, dass Sie es auf diese Weise tun können:

In [183]: df.replace({'DSFS': {r'(\d+)\s*\-\s*(\d+).*': r'\1_\2'}}, regex=True) 
Out[183]: 
    MemberID Year DSFS DrugCount 
0 48925661 Y2 9_10  7+ 
1 90764620 Y3 8_9   3 
2 61221204 Y1 2_3   1 
+0

Diesen Dank halfen! Hier ist mein Problem, ich muss ** df.replace ({'DSFS': {r '(\ d +) \ s * \ - \ s * (\ d +). *': R '\ 1_ \ 2'} }, regex = True) ** in einer Hilfsfunktion, also einer, in der ich nur den Code für eine Konvertierung habe und keinen Datenrahmen öffne. Wie würde ich diesen Ersetzungsschritt in einer Funktion codieren? – squidvision

+0

@squidvision, siehe mein [antworten] (http://stackoverflow.com/a/36444313/5741205) – MaxU

0

Ich habe nicht installiert Pandas , aber die Lösung sollte für df Objekte arbeiten.

string="48925661,Y2,9-10 months,7+" 
"_".join(re.findall(r'\b\d+\b', string.split(",")[2])) 

Testergebnis:

>>> "_".join(re.findall(r'\b\d+\b', string.split(",")[2])) 
'9_10' 

Python-Skript:

$ cat test.py 
with open("sample.csv") as inputs: 
    next(inputs) # skip the first line 
    for line in inputs: 
     parts = line.strip().split(",") 
     parts[2] = "_".join(re.findall(r'\b\d+\b', parts[2])) 
     print(",".join(parts)) 

Ergebnis:

$python test.py         
48925661,Y2,9_10,7+ 
90764620,Y3,8_9,3 
61221204,Y1,2_3,1 
+0

Was ist '\ b \ d + \ b'? – squidvision

+0

\ b ist Wortgrenze und \ d + ist eine numerische Zahl, es entspricht allen numerischen Werten in einer gegebenen Zeichenfolge – haifzhan

0

Wenn Sie einen Iterator verwenden könnte, die besser sein wird. Aber das sind kommaseparierte Werte. Verwenden Sie einfach split() in einer geschickten Weise. Wie die folgenden

cleaned = [line.split(",")[2].replace("-", "_") for line in source] 

wo source wenn ein Dateiobjekt, eine große Liste von Strings oder ein Iterator emittierenden Saiten (die besten)

Verwandte Themen