2017-02-23 12 views
3

Ich habe einen Datensatz, wo jede Zeile einen einzigartigen Verkauf darstellt. Eine Spalte repräsentiert die in diesem Verkauf bestellten Artikel als CSV.Pandas - Split-Spalte gespeichert als csv

Ich muss die Werte in der Spalte "Artikel geordnet" trennen und für jedes bestellte Produkt eine eindeutige Zeile erstellen, die an die ursprüngliche Bestellnummer gebunden ist.

Zum Beispiel:

Order ID Items Ordered 
    127 Item 1, Item 2, Item 3 

Sollte sein:

Order ID Items Ordered 
    127   Item 1 
    127   Item 2 
    127   Item 3 

Ich bin relativ neu in Python/Pandas. Dieser Code funktioniert, ist aber langsam, während ich über alle Befehle iteriere. Was ist ein besserer Weg, dies zu tun?

temp_item_list = [] 

for row in raw_data.iterrows(): 
    for i in range(len(row['Items'])): 
     temp_item_list.append((row['ID'], row['Items'][i])) 

item_df = pd.DataFrame(temp_item_list) 
+0

Bitte Antworten überprüfen. –

Antwort

2

Mit Bezug auf similar answer können Sie diese versuchen, Schritt-für-Schritt-Anleitung:

>>> initial_df = pandas.read_csv("your_file_path") 
>>> final_df = pandas.concat([Series(row['Order ID'], row['Items Ordered'].split(',')) for _, row in initial_df.iterrows()]).reset_index() 
>>> final_df 
    index 0 
0 Item 1 127 
1 Item 2 127 
2 Item 3 127 
>>> final_df.columns= ['Items Ordered','Order ID'] 
>>> final_df 
    Items Ordered Order ID 
0  Item 1  127 
1  Item 2  127 
2  Item 3  127 
>>> final_df[['Order ID','Items Ordered']] 
    Order ID Items Ordered 
0  127  Item 1 
1  127  Item 2 
2  127  Item 3 

Dies wird Ihren Job erledigen.

0

Etwas, das Ihnen helfen könnte, ist pandas.DataFrame.apply. Sie können eine Funktion auf jede Zeile anwenden. Sie können eine Funktion definieren, die das Elementeelement in der Zeile erfasst, aufteilt und die pandas.DataFrame.append aufruft, um für jedes Element eine neue Zeile zu erstellen.

Hier ist ein example zur Verwendung der Anwendung Funktion auch.

4

Um Iterieren durch alle Reihen zu vermeiden, Sie numpy.repeat Spalten Order ID vornehmen können, während die Items Ordered Abflachung und neue Datenrahmen von diesem machen:

from itertools import chain 
import numpy as np 
import pandas as pd 

# count the number of items in the items order column 
items_count = df["Items Ordered"].str.count(",") + 1 

# extend the Order ID column with numpy repeat and flatten Items Order column 
pd.DataFrame({"Order ID": np.repeat(df["Order ID"], items_count), 
       "Items Ordered": list(chain.from_iterable(df["Items Ordered"].str.split(",")))}) 

enter image description here

0

kann dies, was Sie suchen zum;

df = pd.DataFrame({'order_id':127, 'items_ordered': ['item_1, item_2, item_3']}) 
df1 = pd.concat([df.order_id,df.items_ordered.str.split(',').apply(pd.Series)],axis=1,ignore_index=True) 
df1 = df1.pivot(index = df1.index, columns = df1.columns[0]).stack().stack().to_frame() 
df1 = df1.set_index(df1.index.get_level_values(level=1)) 

oder alternativ eine knappere Lösung schwenken und set_index obigen Schritte kombiniert ist:

df1 = pd.melt(df, id_vars = ['order_id'])