2016-12-22 5 views
1

Ich entschuldige mich für die Neophytenfrage, aber es fällt mir schwer, die Datenrahmen der Pandas herauszufinden. Ich habe einen Datenrahmen mit so etwas wieErstellen neuer (detaillierter) Datenrahmen mit Pandas basierend auf Indexdatenrahmen

df_index: 
Product Title 
100000  Sample main product 
200000  Non-consecutive main sample 

ich eine ausführlichere Liste der Produkte mit Formaten einen weiteren Datenrahmen haben, wie

df_details: 
Product     Title 
100000     Sample main product 
100000-Format-English  Sample product details 
100000-Format-Spanish  Sample product details 
100000-Format-French  Sample product details 
110000     Another sample main product 
110000-Format-English  Another sample details 
110000-Format-Spanish  Another sample details 
120000     Yet another sample main product 
120000-Format-English  Yet another sample details 
120000-Format-Spanish  Yet another sample details 
... 
200000     Non-consecutive main sample 
200000-Format-English  Non-consecutive sample details 
200000-Format-Spanish  Non-consecutive sample details 

ich auf df_details einen neuen Datenrahmen basierend erstellen möchten , aber nur für die Produkte, die in df_index erscheinen. Im Idealfall würde es in etwa so aussehen:

new_df: 
Product     Title 
100000     Sample main product 
100000-Format-English  Sample product details 
100000-Format-Spanish  Sample product details 
100000-Format-French  Sample product details 
200000     Non-consecutive main sample 
200000-Format-English  Non-consecutive sample details 
200000-Format-Spanish  Non-consecutive sample details 

Hier ist, was ich bisher ausprobiert habe:

new_df = df_details[df_details['Product'][0:5] == df_index['Product'][0:5]] 

, dass mir einen Fehler gibt:

ValueError: Can only compare identically-labeled Series objects 

ich auch versucht habe

new_df = pd.merge(df_index, df_details, 
    left_on=['Product'[0:5]], right_index=True, how='left') 

Welche gibt mir ar Datendatei, aber nicht die Art, die ich will - es enthält nicht die Details Zeilen mit den Formatinformationen.

Antwort

2

sollten Sie in der Lage sein zu verwenden .isin() wie:

new_df = df_details[df_details['Product'].isin(df_index['Product']] 

werden nur die gemeinsamen Indizes eine Maske aufzublicken Diese führen.

EDIT: Dies funktioniert nur, ob die Spalte die gleiche Zeichenfolge hat. Um dies zu lösen können Sie verwenden str.contains() mit:

import re 

# create a pattern to look for 
pat ='|'.join(map(re.escape, df_index['Product'])) 

# Create the mask 
new_df = df_details[df_details['Product'].str.contains(pat)] 

Dies funktioniert, wenn die Spalte als String formatiert ist.

+0

Nizza. schrieb gerade die gleiche Lösung. –

+0

Das funktioniert, irgendwie. Es gibt mir jedoch nicht die 200000-Format-Englisch-Stil-Zeilen. Möglicherweise, weil es nicht genau die Zeilen entspricht, die wie 200000 aussehen? –

+1

@ nathan.hunt ja du hast Recht, ich dachte, alle Zeilen haben das gleiche Format ... dies führt eine Suche auf 'same-format' Zeilen ... Denken auf eine allgemeinere Lösung .. –

0

Hier ist, wie ich es geschafft habe - ich bin mir sicher, es ist nicht schön, oder der schnellste Weg, es zu erreichen, aber es funktioniert.

I verwendet pandas .itterow() mit einigen for und if Schleifen durch den Datenrahmen Zeile-für-Zeile zu gehen:

# create a list based on the 'Product' column of df_index 
increment = 0 
index_list = [] 
for product, row in df_index.iterrows(): 
    prod_num = df_index.product.iloc[increment] 
    index_list.append(prod_num) 
    increment += 1 

#construct a new data frame based on the rows in df_details that are found in index_list 
new_df = pd.DataFrame(columns=detail_df.columns) 
increment_detail = 0 
for product, row in df_details.iterrows(): 
    prod_num_detail = df_details.product.iloc[increment_detail] 
    prod_num_detail = prod_num_detail[0:6] 
    if str(prod_num_detail) in dupe_list: 
     new_df = new_df.append(df_details.iloc[increment_detail]) 
     increment_detail += 1 
    else: 
     increment_detail += 1 
Verwandte Themen