2017-04-01 5 views
1

Ich habe einen Datenrahmen mit 52 Spalten mit Verkaufsdaten (wöchentlich) und 52 Spalten mit der verkauften Menge. Ich möchte weitere 52 Spalten mit dem Preis pro Verkaufseinheit erstellen.Wie man mehrere Spalten miteinander in Pandas teilt

Die Abteilung funktioniert aus irgendeinem Grund nicht. Ich bekomme

ValueError: Wrong number of items passed 2, placement implies 1

Auch kann dies in einer eleganteren (Pandas Art und Weise) erreicht werden, indem die for-Schleife zu entfernen? Diese

ist, was ich habe ...

#calculate cost per unit 
for i in range(0,52): 
    cw = i + 1 
    i = i + 5 
    print cw 
    data['Cost' + str(cw)] = data.iloc[:,i:i+1]/sap_data.iloc[:,i+52:i+1+52] 
+0

Bitte geben Sie kleine (3-5 Zeilen) reproduzierbaren Datensatz und gewünschte dta Set – MaxU

Antwort

1

Demo von vektorisiert Pandas Lösung haben:

In [23]: df = pd.DataFrame(np.random.randint(1, 8, (5, 6)), 
          columns=['amt01','amt02','amt03','qty01','qty02','qty03']) 

In [24]: df 
Out[24]: 
    amt01 amt02 amt03 qty01 qty02 qty03 
0  2  2  6  2  3  6 
1  4  3  7  3  7  5 
2  3  2  2  7  7  5 
3  3  7  4  4  3  1 
4  4  6  2  1  7  3 

In [25]: cols = ['new{:02d}'.format(i) for i in np.arange(1, 3+1)] 

In [26]: cols 
Out[26]: ['new01', 'new02', 'new03'] 

In [27]: df[cols] = df.filter(regex='^amt').div(df.filter(regex='^qty').values) 

In [28]: df 
Out[28]: 
    amt01 amt02 amt03 qty01 qty02 qty03  new01  new02  new03 
0  2  2  6  2  3  6 1.000000 0.666667 1.000000 
1  4  3  7  3  7  5 1.333333 0.428571 1.400000 
2  3  2  2  7  7  5 0.428571 0.285714 0.400000 
3  3  7  4  4  3  1 0.750000 2.333333 4.000000 
4  4  6  2  1  7  3 4.000000 0.857143 0.666667 
1

Meinten Sie nur

data['sales']/data['quantity'] 

bearbeiten: Es könnte eine Notation Angelegenheit sein. Können Sie versuchen:

data.iloc[:,i]/sap_data.iloc[:,i+52] 

die meiner Meinung nach ist das, was Sie im Sinn

+0

grundsätzlich ja. aber während man durch Spalten schiebt ... wie man sieht, habe ich versucht "/" zu verwenden. Was gescheitert ist. – Jabb

1

Sie Pandas pandas.DataFrame.divide Funktion nutzen zu können. Ist das wonach Sie suchen?

df = pd.DataFrame({'sales 1': [100,200,300], 'sales 2': [400,500,600], 'quantity 1': [10,20,30], 'quantity 2': [40,50,60]}) 
print(df) 
     quantity 1 quantity 2 sales 1 sales 2 
0   10   40  100  400 
1   20   50  200  500 
2   30   60  300  600 

Erstellen 2 neuen Datenrahmen, eine für die sales Spalten df1 und die andere der quantity Spalten df2. In Ihrem Fall würden Sie es auf 52 statt 2.

df1 = df.iloc[:, :2] 
df2 = df.iloc[:,2:] 
print(df1) 
      quantity 1 quantity 2 
0   10   40 
1   20   50 
2   30   60 
print(df2) 
     sales 1 sales 2 
0  100  400 
1  200  500 
2  300  600 

Umbenennung der Spalten in df2 mit den Namen von df1 setzen müssen.

df2.columns = df1.columns 

Dann df3 Erstellen eines neuen Datenrahmens.

df3 = df2.divide(df1, axis= 1) 

df3 ist das Ergebnis der Division Sie benötigen. Wenn Sie alle diese Daten in einem Datenrahmen haben wollen, müssen Sie nur die Spalten und concatenate die 3 Datenrahmen umbenennen.

print(df3) 
     quantity 1 quantity 2 
0  10.0  10.0 
1  10.0  10.0 
2  10.0  10.0