2015-09-15 114 views
0

對不起,我現在很抱歉,剛開始學習Python並試圖讓一些工作。Python熊貓的多種條件

好的數據集是

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 

我想通過名稱或ID來過濾特定的位置,不打擾我,然後挑選該位置的最低價格。最好將其硬編碼,因爲我只有幾個我感興趣的位置。例如locationid = 60008494.

我看到你可以在一行上做兩個條件,但我看不到如何應用它。 所以我試圖嵌套它。 不一定是熊貓,只是看起來我發現的第一件事是做了我需要的一部分。

到目前爲止我得到的代碼是,並且只是我所期望實現的最小部分。

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" 

已更新。 好吧,最新的部分,看起來像下面的代碼是我應該進去的方向。如果我可以有s = typeid,locationid和price,那是完美的。所以我寫了我想要做的事情,在python中得到它的正確語法是什麼?對不起,我習慣於Excel和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

嗨,歡迎來到Stack Overflow。我們很難說出這裏出了什麼問題,以及你的期望。也許你可以給我們更多的信息,特別是:你期望從你的代碼中得到的輸出是什麼?你取而代之的是什麼?你是否嘗試過各自的條件,以確保它們在合併之前自行工作?他們是否達到了你期望的結果?向我們展示結果?注意:請編輯您的問題並在其中添加此信息 - 不要將它放在註釋中,因爲代碼格式很糟糕。 –

+0

好吧,有數千個typeid和數千個位置。只是想能夠過濾特定的位置和每個類型,以產生最低的價格。 我遇到的主要問題是正確的使用方法,並將其置於可以在以下條件下使用產品的狀態?所以我最終從csv導入,計算,然後導出到csv,所以我可以使用結果。 所以這個過程基本上是,我只想要位置60008494,按組,然後找到每個typeid的最低價格值,爲那個位置。 希望更清楚。 – JoeEve

+0

那麼,你不需要給我們你的完整數據庫......只是你想要的一些示例數據和示例輸出。您可以假裝數據庫中只有4-5行,並將其用作具有代表性的示例。 –

回答

0

如果我正確理解你的問題,你真的不會需要做的比DataFrame.Groupby()得多。作爲一個例子,可以組由locationname數據幀,然後從所得GROUPBY對象price柱,然後使用min()方法輸出的最小值爲每個組:

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

這將給你的每個組的最小值爲price。因此,它看起來像:

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

如果你真正想要的是 -

我想過濾特定位置按姓名或ID,不打擾我,然後選擇該位置的最低價格。最好將其硬編碼,因爲我只有幾個我感興趣的位置。 e.g locationid = 60008494.

你可以簡單地過濾的locationid第一的東風,然後使用['price'].min()。示例 -

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 

如果你想這樣做的所有locationids',然後在對方回答說,你可以使用DataFrame.groupby爲,然後採取你想要的組['price']列,並使用.min()。示例 -

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

演示 -

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

爲了得到其在相應的組最小值的完整的行,你可以使用idxmin()獲得指數爲最低值,然後通過它以df.loc來獲取這些行。示例 -

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

其中「locationid」== 60008494 s = data.groupby( ['typeid'])['price']。min() 第二行是完美的,但是如何實現第一個階段,其中可以通過應用子集來指定位置ID? – JoeEve

+0

如果你想只爲一個特定的locationid使用第一種方法 - 'data [data ['locationid'] == 60008494] ['price']。min()' –

+0

好吧,我到了那裏。 對於s =部分,你將如何添加locationid,那麼我可以導出到csv這三列? – JoeEve