2016-05-15 18 views
4

ich einen Datenrahmen wie dieses:Python aufgeteilt Datenrahmen Spalten in mehrere Zeilen

-------------------------------------------------------------------- 
Product  ProductType  SKU    Size 
-------------------------------------------------------------------- 
T-shirt  Top   [111,222,333,444] ['XS','S','M','L'] 
Pant(Flared) Bottoms  [555,666]   ['M','L'] 
Sweater  Top   None    None 

ich die unten ausgegeben werden soll:

Product  ProductType  SKU  Size 
T-shirt  Top    111  XS 
T-shirt  Top    222  S 
T-shirt  Top    333  M 
T-shirt  Top    444  L 
Pant(Flared) Bottoms   555  M 
Pant(Flared) Bottoms   666  L 
Sweater  Top    None  None 

Ich habe versucht, den folgenden Code:

s = df['SKU'].apply(Series,1).stack() 
s.index = s.index.droplevel(-1) 
s.name = 'SKU' 
del df['SKU'] 
df = df.join(s) 

r = df['Size'].apply(Series,1).stack() 
r.index = r.index.droplevel(-1) 
r.name = 'Size' 
del df['Size'] 
df = df.join(r) 

Aber das explodiert in die folgenden:

Product  ProductType SKU    Size 
T-shirt  Top   111    XS 
T-shirt  Top   111    S 
T-shirt  Top   111    M 
T-shirt  Top   111    L 
T-shirt  Top   222    XS 
T-shirt  Top   222    S 
T-shirt  Top   222    M 
T-shirt  Top   222    L 
T-shirt  Top   333    XS 
T-shirt  Top   333    S 
T-shirt  Top   333    M 
T-shirt  Top   333    L 
T-shirt  Top   444    XS 
T-shirt  Top   444    S 
T-shirt  Top   444    M 
T-shirt  Top   444    L 
Pant(Flared) Bottoms  555    M 
Pant(Flared) Bottoms  555    L 
Pant(Flared) Bottoms  666    M 
Pant(Flared) Bottoms  666    L 

Beachten Sie, dass ich der Einfachheit halber zwei Spalten hinzugefügt habe, die wiederholt werden (Product, ProductType), aber ich habe 5 solche Spalten, die Zeichenfolgen enthalten. Ich möchte im Grunde die SKU mit der Größe für jedes Produkt verbinden.

Kann mir hier jemand helfen?

Antwort

4

Dies ist offen für Fehler so mit Vorsicht verwenden.

Convert Produkt Spalte zu einer Sammlung von Listen, deren Größen gleich sind mit den Listen in anderen Spalten (sagen wir, Spalte SKU Dies wird, wenn die Listen nicht funktionieren in SKU und Größe sind unterschiedlich lang)

df["Product"] = df["Product"].map(list) * df["SKU"].map(len) 

Out[184]: 
        SKU   Size  Product 
0 [111, 222, 333, 444] [XS, S, M, L] [a, a, a, a] 
1   [555, 666]   [M, L]  [b, b] 

die Summe der Spalten nehmen (es wird die Listen erweitern) und dass mit to_dict() an den Datenrahmen Konstruktor übergeben:

pd.DataFrame(df.sum().to_dict()) 
Out[185]: 
    Product SKU Size 
0  a 111 XS 
1  a 222 S 
2  a 333 M 
3  a 444 L 
4  b 555 M 
5  b 666 L 

bearbeiten:

Für mehrere Spalten können Sie die Spalten definieren wiederholt werden:

cols_to_be_repeated = ["Product", "ProductType"] 

Speichern Sie die Zeilen, die Werte None in einem anderen Datenrahmen hat:

na_df = df[pd.isnull(df["SKU"])].copy() 

Tropfen Keine ist aus dem ursprünglichen Datenrahmen:

df.dropna(inplace = True) 

Iterate über diesen Spalt:

for col in cols_to_be_repeated: 
    df[col] = df[col].map(lambda x: [x]) * df["SKU"].map(len) 

Und den gleichen Ansatz verwenden:

pd.concat([pd.DataFrame(df.sum().to_dict()), na_df]) 

     Product ProductType SKU Size 
0  T-shirt   Top 111.0 XS 
1  T-shirt   Top 222.0  S 
2  T-shirt   Top 333.0  M 
3  T-shirt   Top 444.0  L 
4 Pant(Flared)  Bottoms 555.0  M 
5 Pant(Flared)  Bottoms 666.0  L 
2  Sweater   Top NaN None 

Es könnte besser sein, auf einer Kopie des ursprünglichen Datenrahmen zu arbeiten.

+0

Die Größe und die Artikelnummer haben immer die gleiche Größe. Auch, wenn ich mehrere Spalten außer Produkt habe. Zum Beispiel: Produkttyp, der zusammen mit Product repliziert werden muss. – coder1416

+0

Auch .. tthe das eigentliche Produkt ist eine Zeichenfolge .. so, wenn ich es in eine Liste umwandeln, Es teilt es als alle mehrere Zeichen in der Zeichenfolge .. @ayhan – coder1416

+0

Sagen wir, die Daten sind wie folgt: 'Produktname T-Shirt Produkttyp Oberteile – coder1416

Verwandte Themen