2017-06-14 2 views
1

Ich habe folgende DatenWie in Pandas

Description 
4 GB+ 2 GB Night 3G/2G Data 
Unlimited Local & STD Calls + 500 MB 3G/2G Data (T&C apply) 
9GB + 8GB night data+ 6GB next night data 
8 GB data 4G 

Was ich will, ist zu extrahieren Datenmenge (4 GB usw.) und kombinierte sie in einer einzigen Spalte ein einziges Muster in einem String mehr als einmal extrahieren

df2=df['Description'].str.extract('([0-9]+(\.[0-9][0-9]?)?\s?GB|[0-9]+(\.[0-9][0-9]?)?\s?MB)') 

ich verwendet habe Pandas funktionieren extractall() auch, aber beide extract und extractall() mich so

0  1 2 
4GB Nan Nan  #2 gb is missing 
500MB Nan Nan 
9GB Nan Nan  # 8gb 6 gb is missing 
8Gb Nan Nan 
führen zu geben

Wo liege ich falsch? Auch wenn die Zeilen mit df.fillna(' ') Kombinieren ich erhalte eine Ausgabe wie diese

 0 
    4GB,2GB, 
    500MB, , 
    9GB,8GB,6GB 
    8GB, , 

obwohl das, was ich will

ist
0 
4GB,2GB 
500MB 
9GB,8GB,6GB 
8GB 

Ich möchte nicht spaces.Is es eine Möglichkeit, in Pandas, die Daten zu bekommen das obige Format? Ich bin ein Anfänger in Python, weiß nicht, wie man das erreicht. Wenn es einen anderen Weg gibt, erwähnen Sie bitte.

EDIT:

dies der vollständige Code:

df2=df['Description'].str.extractall('([0-9]+(\.[0-9][0-9]?)?\s?GB|[0-  9]+(\.[0-9][0-9]?)?\s?MB)') 
#print df2 
df2[1].fillna("",inplace=True); 
df2[2].fillna("",inplace=True) 
print df2 
df3=df2[0]+','+df2[1]+','+df2[2]; 
print df3 
+0

Warum tun Sie nicht .fillna ("")? – Tbaki

+0

Können Sie auch einen Beispielcode erben, der Ihren Datenrahmen generiert? – Tbaki

+0

sogar mit .fillna ('') kommen die Kommas mit Leerzeichen –

Antwort

1

extractall verwenden sollten wor k wie folgt:

df.Description.str\ 
    .extractall('(\d*\s?[GM]B)').groupby(level=0)\ 
    .apply(lambda x: ','.join(x[0])\ 
    .replace(' ','')) 
Out[75]: 
0  4GB,2GB 
1   500MB 
2 9GB,8GB,6GB 
3   8GB 
dtype: object 
+0

Danke, du hast mein Problem gelöst, aber kannst du erklären, was drinnen ist? –

+0

innerhalb gelten, es ist nur beitreten diese Felder (4 GB, 2 GB usw.) zusammen und trennte sie durch "," – Allen

+0

ok Ich habe es noch einmal danke –

0

Sie können die Daten als Spalten erhalten wie diese

df2=df['Description'].str.extractall('([0-9]+(\.[0-9][0-9]?)?\s?GB|[0-9]+(\.[0-9][0-9]?)?\s?MB)') 
df2.reset_index().groupby('match')[0].apply(lambda x: "{%s}" % ', '.join(x)).apply(lambda x:x.replace(" ","")) 

Ausgang:

match 
0 {4GB,500MB,9GB,8GB} 
1    {2GB,8GB} 
2     {6GB} 
Name: 0, dtype: object 
1
df2=df['Description'].str.extractall('(\d*\.\d+|\d+\s?GB|\d*\.\d+|\d+\s?MB)').reset_index() 
df2 = pd.pivot_table(df2, index='level_0', columns="match", values=0, aggfunc='last').reset_index(drop=True) 
df2 = df2.apply(lambda row: ','.join(row.dropna()), axis=1) 

diesen Code Versuchen Sie, für Ihre erwartete Ausgabe.