2015-09-15 1 views
0

Désolé, je m'excuse maintenant, juste commencé à apprendre Python et en essayant de faire fonctionner quelque chose.Python pandas plusieurs conditions

ensemble de données Ok est

Buy, typeid, volume, issued, duration, Volume Entered,Minimum Volume, range, price, locationid, locationname 

SELL 20 2076541 2015-09-12T06:31:13 90 2076541 1 region 331.21 60008494 Amarr 

SELL 20 194642 2015-09-07T19:36:49 90 194642 1 region 300 60008494 Amarr 

SELL 20 2320 2015-09-13T07:48:54 3 2320 1 region 211 60008491 Irnin 

Je voudrais filtrer un emplacement spécifique par nom ou ID, ne me dérange pas, puis de choisir le prix minimum pour cet emplacement. De préférence pour le coder en dur, puisque je n'ai que quelques endroits qui m'intéressent. Par exemple: locationid = 60008494.

Je vois que vous pouvez faire deux conditions sur une ligne, mais je ne vois pas comment l'appliquer. Alors j'essaye de l'imbriquer. N'a pas besoin d'être pandas, il semble que la première chose que j'ai trouvée a fait partie de ce que j'avais besoin.

Le code que j'ai obtenu jusqu'ici est, et ne fait que la partie minimale de ce que je cherche à atteindre.

data = pd.read_csv('orders.csv') 
length = len(data['typeid'].unique()) 
res = pd.DataFrame(columns=('Buy', 'typeid', 'volume','duration','volumeE','Minimum','range','price','locationid','locationname')) 
for i in range(0,length): 
     name_filter = data[data['typeid'] == data['typeid'].unique()[i]] 
     price_min_filter = name_filter[name_filter['price'] == name_filter['price'].min() ] 
     res = res.append(price_min_filter, ignore_index=True) 
     i=i+1 
     res.to_csv('format.csv') # writes output to csv 
print "Complete" 

MISE À JOUR. Ok donc, la dernière partie, semble que le code suivant est la direction que je devrais aller. Si je pouvais avoir s = typeid, locationid et prix, c'est parfait. J'ai donc écrit ce que je veux faire, quelle est la syntaxe correcte pour l'obtenir en python? Désolé, je suis habitué à Excel et SQL.

import pandas as pd 

df = pd.read_csv('orders.csv') 
df[df['locationid'] ==60008494] 
s= df.groupby(['typeid'])['price'].min() 
s.to_csv('format.csv') 
+1

Salut et bienvenue dans Stack Overflow. Il est difficile pour nous de dire ce qui ne va pas ici, et ce que vous attendez. Peut-être pourriez-vous nous donner un peu plus d'information, en particulier: quelle est la sortie que vous attendez de votre code? Qu'est-ce que vous obtenez à la place? Avez-vous essayé chacune des conditions de leur propre chef pour s'assurer qu'ils travaillent seuls avant de combiner? Ont-ils atteint les résultats auxquels vous vous attendiez? Montrez-nous les résultats? Note: veuillez éditer votre question et ajouter cette information là - ne la mettez pas dans les commentaires car le formatage du code est horrible. –

+0

Ok, eh bien, il y a des milliers de caractères et des milliers d'emplacements. Je voulais juste être en mesure de filtrer pour des emplacements spécifiques et pour chaque typeid, de produire le prix minimum. Le principal problème que j'ai est divining la bonne formule et le mettre dans un état où je peux utiliser les produits pour les conditions suivantes? Donc, je finis par importer un csv, calculer, puis exporter vers un csv, donc je peux utiliser les résultats. Donc, le processus est essentiellement, je veux seulement l'emplacement 60008494, grouper par, puis trouver la valeur de prix minimum pour chaque typeid, pour ce seul emplacement. J'espère que c'est plus clair. – JoeEve

+0

Eh bien, vous n'avez pas besoin de nous donner votre base de données complète ... juste quelques exemples de données et exemples de sortie que vous attendez. Vous pouvez prétendre qu'il n'y a que 4 ou 5 lignes dans votre base de données et l'utiliser comme un échantillon représentatif. –

Répondre

0

Si je comprends bien votre question, vous aurez vraiment pas besoin de faire beaucoup plus qu'un DataFrame.Groupby(). À titre d'exemple, vous pouvez regrouper la trame de données par le locationname, puis sélectionnez la colonne price de l'objet groupby résultant, puis utilisez la méthode min() pour produire la valeur minimale pour chaque groupe:

data.groupby('locationname')['price'].min() 

qui vous donnera la valeur minimale de price pour chaque groupe. Donc, il ressemblera à quelque chose comme:

locationname 
Amarr 300 
Irnin 211 
Name: price, dtype: float64 
1

Si ce que vous voulez vraiment est -

Je voudrais filtrer un emplacement spécifique par nom ou ID, ne me dérange pas, alors Choisissez le prix minimum pour cet endroit. De préférence pour le coder en dur, puisque je n'ai que quelques endroits qui m'intéressent. LocationID = par exemple 60008494.

Vous pouvez simplement filtrer l'df sur la locationid, puis utilisez ['price'].min(). Exemple -

In [1]: import pandas as pd 

In [2]: s = """Buy,typeid,volume,issued,duration,Volume Entered,Minimum Volume,range,price,locationid,locationname 
    ...: SELL,20,2076541,2015-09-12T06:31:13,90,2076541,1,region,331.21,60008494,Amarr 
    ...: SELL,20,194642,2015-09-07T19:36:49,90,194642,1,region,300,60008494,Amarr 
    ...: SELL,20,2320,2015-09-13T07:48:54,3,2320,1,region,211,60008491,Irnin""" 

In [3]: import io 

In [4]: df = pd.read_csv(io.StringIO(s)) 

In [5]: df 
Out[5]: 
    Buy typeid volume    issued duration Volume Entered \ 
0 SELL  20 2076541 2015-09-12T06:31:13  90   2076541 
1 SELL  20 194642 2015-09-07T19:36:49  90   194642 
2 SELL  20  2320 2015-09-13T07:48:54   3   2320 

    Minimum Volume range price locationid locationname 
0    1 region 331.21 60008494  Amarr 
1    1 region 300.00 60008494  Amarr 
2    1 region 211.00 60008491  Irnin 

In [8]: df[df['locationid']==60008494]['price'].min() 
Out[8]: 300.0 

Si vous voulez le faire pour tous les locationids', puis comme dit dans l'autre réponse que vous pouvez utiliser pour cela DataFrame.groupby puis prendre la colonne ['price'] pour le groupe que vous voulez et utiliser .min().Exemple -

data = pd.read_csv('orders.csv') 
data.groupby(['locationid'])['price'].min() 

Démo -

In [9]: df.groupby(['locationid'])['price'].min() 
Out[9]: 
locationid 
60008491 211 
60008494 300 
Name: price, dtype: float64 

Pour obtenir la ligne complète qui a des valeurs minimales dans les groupes correspondants, vous pouvez utiliser idxmin() pour obtenir l'indice de la valeur minimale et ensuite passer à df.loc pour obtenir ces lignes. Exemple -

In [9]: df.loc[df.groupby(['locationid'])['price'].idxmin()] 
Out[9]: 
    Buy typeid volume    issued duration Volume Entered \ 
2 SELL  20 2320 2015-09-13T07:48:54   3   2320 
1 SELL  20 194642 2015-09-07T19:36:49  90   194642 

    Minimum Volume range price locationid locationname 
2    1 region 211 60008491  Irnin 
1    1 region 300 60008494  Amarr 
+0

où "locationid" == 60008494 s = data.groupby (['typeid']) ['price']. min() La deuxième ligne est parfaite, mais comment implémentez-vous la première étape, où l'identifiant de localisation peut être spécifié pour que le groupe s'applique au sous-ensemble? – JoeEve

+0

Si vous voulez que le min seulement pour un locationid spécifique, utilisez la première méthode - 'data [data ['locationid'] == 60008494] ['price']. Min()' –

+0

D'accord, j'y arrive. Pour la partie s =, comment ajouteriez-vous locationid, alors je peux exporter vers csv ces trois colonnes? – JoeEve