2017-03-10 2 views
1

Ich habe einen Datenrahmen mit 3 Spalten und mehr als 1.000 Zeilen,Wie kann man einen DataFrame unter Verwendung der for-Schleife in Python unterteilen und auflisten?

df 
    day   product   order 
2010-01-01 150ml Mask   9 
2010-01-02 230ml Lotion  27 
2010-01-03 600ml Shampoo  33 

Und ich möchte jedes Produkt, wie folgend der Teilmenge,

df_mask     df_lotion   df_shampoo 
    day  order  day  order  day   order 
2010-01-01  9  2010-01-02 27  2010-01-03 33 
2010-01-09  8  2010-01-05 30  2010-01-04 25 
2010-01-11  13  2010-01-06 29  2010-01-06 46 

Dies ist, wie ich es tun,

# Create a product list 
productName = df['product'].tolist() 

# Subsetting 
def subtable(df,productName): 
    return (df[(df['product'] == productName)]) 

# Subsetting 
df_mask = subtable(df, '150ml Mask') 
df_lotion = subtable(df, '230ml Lotion') 
df_shampoo = subtable(df, '230ml Shampoo') 

Gibt es eine Möglichkeit, alle Subsets einmal mit for-Schleife zu bekommen, da der Datenrahmen viele verschiedene Produkte hat.

Antwort

2

Sie groupby für diesen Zweck verwenden können, die genau das tut, was Sie brauchen:

# show example data 
print(df) 

    day   product    order 
0 2010-01-01 "150ml Mask"   9 
1 2010-01-02 "230ml Lotion"  27 
2 2010-01-03 "600ml Shampoo"  33 
3 2010-01-04 "250ml Mask"   12 
4 2010-01-05 "330ml Lotion"  24 
5 2010-01-06 "400ml Shampoo"  13 

# split product column and keep only product name 
df["product"] = df["product"].str.split(expand=True)[1] 

# groupby product 
products = df.groupby("product") 

# print product and corresponding product df 
for product, product_df in products: 
    print(product) 
    print(product_df) 

Lotion 
      day product order 
1 2010-01-02 Lotion  27 
4 2010-01-05 Lotion  24 

Mask 
      day product order 
0 2010-01-01 Mask  9 
3 2010-01-04 Mask  12 

Shampoo 
      day product order 
2 2010-01-03 Shampoo  33 
5 2010-01-06 Shampoo  13 

Um jede Untergruppe einzeln zugreifen zu können, können Sie get_group verwenden was entspricht Ihrer subtable Funktion:

Schließlich erhalten alle Unterdatenrahmen innerhalb eines Wörterbuch, können Sie eine Schleife über products und legen Sie die Produkt-Säule selbst:

df_dict = {product: product_df.drop("product", axis=1) 
      for product, product_df in products} 
print(df_dict["Mask"]) 

    day   order 
0 2010-01-01 9 
3 2010-01-04 12 
+0

Vielen Dank für Ihre Antwort. Ich habe 'df [" product "] = df [" Produkt "]. Str.split (expand = True) [1]' versucht, aber einige Produktnamen sind nicht organisiert, da einige Produktnamen wie '0.7OZ Mask UK 6' aussehen . Gibt es einen anderen Weg, das Problem zu beheben? – Peggy

+0

@peggy Was sind die möglichen Variationen der Produktetiketten? Die vollständige Extraktion des Produktnamens hängt von Ihren Eingabedaten ab. Allerdings sollte 'df [" product "]. Str.split (expand = True) [1]' für Ihr angegebenes Beispiel in Ihrem Kommentar * Mask * erfolgreich aus '0.7OZ Mask UK 6' extrahieren. Oder brauchst du * Mask * inklusive * UK 6 *? – pansen

+0

Ja. Ich werde _Mask UK 6_ brauchen. Aber ich beschloss, jedem Produkt eine bestimmte Nummer zuzuweisen, um das Sortieren zu erleichtern. Ansonsten laufen die Codes ziemlich gut. Vielen Dank! – Peggy

0

sehen, ob es hilft:

dfs = {} 
for grp in df.groupby('product'): 
    dfs[grp[0].split(' ')[1]] = grp[1] # split gives you the product name as key 

for key in dfs.keys(): 
    print dfs[key] 
0

Ich glaube, Sie dict für die Speicherung aller DataFrames verwenden können, die dict comprehension mit groupby erstellt und split:

producs = df['product'].str.split().str[-1] 
print (producs) 
0  Mask 
1  Lotion 
2 Shampoo 
Name: product, dtype: object 

dfs = {i:df.reset_index(drop=True) for i, df in df.groupby(producs)} 
print (dfs) 
{'Shampoo':   day  product order 
0 2010-01-03 600ml Shampoo  33, 'Mask':   day  product order 
0 2010-01-01 150ml Mask  9, 'Lotion':   day  product order 
0 2010-01-02 230ml Lotion  27} 

print (dfs['Shampoo']) 
      day  product order 
0 2010-01-03 600ml Shampoo  33 

Wenn Sie entfernen müssen Spalte product Verwendung Teilmenge [['day','order']] oder drop:

dfs = {i:df.reset_index(drop=True)[['day','order']] for i, df in df.groupby(producs)} 
#dfs = {i:df.reset_index(drop=True).drop('product', axis=1) for i, df in df.groupby(producs)} 
print (dfs) 
{'Shampoo':   day order 
0 2010-01-03  33, 'Mask':   day order 
0 2010-01-01  9, 'Lotion':   day order 
0 2010-01-02  27} 

print (dfs['Shampoo']) 
      day order 
0 2010-01-03  33 
Verwandte Themen