2017-01-08 2 views
1

Ich habe kleine Marktprodukte Verkaufsdaten in Pandas dateframe:Erstellen Sie zusätzliche Datenrahmen auf der Grundlage der bestehenden

date  product name turnover qty receipts_qty profit 

2015-42 2889220 milk 17.73  3.000  3  13.2700 
2015-42 2905772 bread 40.94  2.000  2  40.9400 
2015-42 2876012 salt 291.36 5.000  3  292.2450 
2015-42 2846814 cakes 92.43  4.000  4  55.5300 
... 
2015-46 2889220 milk 12.44  2.000  2  9.9344 
2015-46 2905772 bread 62.11  3.000  3  62.1100 
2015-42 2876012 salt 210.76 4.000  3  190.0050 
2015-42 2846814 cakes 120.27 5.000  4  72.1300 


[14934 rows x 7 columns] 

Was ich brauche ist weitere zwei Datenrahmen zu erhalten, basierend auf ‚Menge‘ Spalt zwischen Anfang und Ende Daten - eine für Produkte, die im Verkauf gestiegen sind, und eine zweite für Produkte, die im Verkauf gefallen sind. Etwas wie folgt aus:

Increase 
name qty_change profit_change 

bread 1.000  21.2700 
cakes 1.000  16.6000 
... 

Decrease 
name qty_change profit_change 

milk -1.000  -3,3356 
salt -1.000  -102,2400 
... 
+0

So etwas wie 'erhöhen = df [df.groupby ('name') ['qty']. Diff()> 0]; sink = df.groupby ('name') ['qty']. diff() <0] 'könnte ein guter Ausgangspunkt sein. – Abdou

+0

@Abdou funktioniert nicht: im Testbeispiel von 8 Zeilen mit 4 Produktpaaren gefunden nur eine Erhöhung (sollte zwei sein) und zwei Abnahme (das ist ok). Berechnet auch nicht die Mengendifferenz - nimmt nur den letzten Wert. – Charnel

+0

Bitte beachten Sie die Antwort. Es verwendet Ihren Beispieldatensatz und erhält Ihre gewünschte Ausgabe. Bitte versuchen Sie es und melden Sie sich zurück. – Abdou

Antwort

1

Sie können versuchen:

import pandas as pd 

products = pd.DataFrame({'product': [2889220, 2905772, 2876012, 2846814, 2889220, 2905772, 2876012, 2846814], 
    'date': ['2015-42', '2015-42', '2015-42', '2015-42', '2015-46', '2015-46', '2015-42', '2015-42'], 
    'receipts_qty': [3, 2, 3, 4, 2, 3, 3, 4], 
    'qty': [3.0, 2.0, 5.0, 4.0, 2.0, 3.0, 4.0, 5.0], 
    'profit': [13.27, 40.94, 292.245, 55.53, 9.9344, 62.11, 190.005, 72.13], 
    'name': ['milk', 'bread', 'solt', 'cackes', 'milk', 'bread', 'solt', 'cackes'], 
    'turnover': [17.73, 40.94, 291.36, 92.43, 12.44, 62.11, 210.76, 120.27]}) 


products[['qty_change','profit_change']] = products.groupby('name')[['qty','profit']].diff() 

increase = products[products.qty_change > 0][['name','qty_change','profit_change']] 
print(increase) 

#  name qty_change profit_change 
#5 bread   1.0   21.17 
#7 cackes   1.0   16.60 


decrease = products[products.qty_change < 0][['name','qty_change','profit_change']] 

print(decrease) 
# name qty_change profit_change 
#4 milk  -1.0  -3.3356 
#6 solt  -1.0  -102.2400 

Ich hoffe, das hilft.

+0

danke, das hat fast funktioniert - berechnet keinen Gewinnunterschied, ich habe nur Nullen in der Spalte profit_change. – Charnel

+0

ist das nicht "profit_change"? Es entspricht Ihrer erwarteten Ausgabe. – Abdou

+0

Überprüfen Sie Ihre 'Profit'-Spalte, um sicherzustellen, dass es von einem numerischen Typ ist (d. H. Dass es Zahlen enthält). – Abdou

Verwandte Themen