2013-10-08 59 views
37

我正在從R轉換到Python。我剛開始使用熊貓。我有一個很好的子集R代碼:子集Python數據框

k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product)) 

現在,我想在Python中做類似的東西。這是我到目前爲止:

import pandas as pd 
data = pd.read_csv("../data/monthly_prod_sales.csv") 


#first, index the dataset by Product. And, get all that matches a given 'p.id' and time. 
data.set_index('Product') 
k = data.ix[[p.id, 'Time']] 

# then, index this subset with Time and do more subsetting.. 

我開始覺得我這樣做是錯誤的。也許,有一個優雅的解決方案。誰能幫忙?我需要從我擁有的時間戳和子集中提取月份和年份。也許有一條線可以完成這一切:

k1 <- subset(data, Product = p.id & Time >= start_time & Time < end_time, select = c(Time, Product)) 

謝謝。

回答

66

我假設TimeProduct處於DataFrame列,dfDataFrame一個實例,並且其他變量標量值:

現在,你必須引用DataFrame實例:

k1 = df.loc[(df.Product == p_id) & (df.Time >= start_time) & (df.Time < end_time), ['Time', 'Product']] 

括號也是必需的,因爲&運算符與比較運算符的優先級。 &運算符實際上是一個重載位運算符,它與算術運算符具有相同的優先級,而算術運算符優先於比較運算符。

pandas 0.13一個新的實驗DataFrame.query()方法將可用。這是非常相似的子集模的select說法:

隨着query()你會做這樣的:

df[['Time', 'Product']].query('Product == p_id and Month < mn and Year == yr') 

這裏有一個簡單的例子:

In [9]: df = DataFrame({'gender': np.random.choice(['m', 'f'], size=10), 'price': poisson(100, size=10)}) 

In [10]: df 
Out[10]: 
    gender price 
0  m  89 
1  f 123 
2  f 100 
3  m 104 
4  m  98 
5  m 103 
6  f 100 
7  f 109 
8  f  95 
9  m  87 

In [11]: df.query('gender == "m" and price < 100') 
Out[11]: 
    gender price 
0  m  89 
4  m  98 
9  m  87 

,你是最後的查詢有興趣的人甚至可以利用鏈式比較,像這樣:

k1 = df[['Time', 'Product']].query('Product == p_id and start_time <= Time < end_time') 
+0

感謝Philip。它運作良好。這就是我一直在尋找的 - 一個簡單,快速的解決方案。非常感謝。對於那些尋找這樣的解決方案,我使用的時間是這樣的:(data.ts> ='2012-10-01')&(data.ts <'2013-05-01')。 – user1717931

+0

當然!樂於幫助。 –

+0

@Philip,我嘗試了iPython的建議,在我的條件下使用了具體的值。他們工作得很好。但是,當我將其嵌入程序並調用參數時,出現錯誤 - 最後一行是:'code' File「/usr/local/lib/python2.7/dist-packages/pandas/core/series如果len(self)!= len(other):類型錯誤:未定義對象的len() – user1717931

14

只是爲了有人找更類似於R A的解決方案:

df[(df.Product == p_id) & (df.Time> start_time) & (df.Time < end_time)][['Time','Product']] 

無需data.locquery,但我認爲這是一個有點長。

5

我發現你可以使用任何子集條件包裝它在[]。舉例來說,你有列[「產品」,「時間」,「年」,「顏色」]

而且我們說你要包括2014年你可以寫之前進行產品DF,

df[df['Year'] < 2014] 

要返回這種情況下的所有行。您可以添加不同的條件。

df[df['Year'] < 2014][df['Color' == 'Red'] 

然後,只需按照上面的指示選擇所需的列。例如,上面df的產品顏色和密鑰,

df[df['Year'] < 2014][df['Color' == 'Red'][['Product','Color']]