子集Python数据框

我正在从R转换到Python。 我刚开始使用pandas。 我有一个很好的子集R代码:

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.. 

我开始觉得我这样做是错误的。 也许,有一个优雅的解决scheme。 谁能帮忙? 我需要从我拥有的时间戳和子集中提取月份和年份。 也许有一句话能够完成这一切:

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

谢谢。

我假定TimeProductDataFrame中的列, dfDataFrame一个实例,其他variables是标量值:

现在,您将不得不引用DataFrame实例:

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

由于&运算符与比较运算符的优先级,括号也是必需的。 &运算符实际上是一个重载的按位运算符,它与算术运算符具有相同的优先级,而运算符优先于比较运算符。

在0.13版本的pandas将会有一个新的实验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') 

只是为了寻找更类似于R的解决scheme:

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

不需要data.locquery ,但我认为它有点长。

我发现你可以使用任何子集条件包装在[]给定的列。 例如,你有一个df的列['Product','Time','Year','Color']

假设您想要包含2014年以前制作的产品。您可以编写,

 df[df['Year'] < 2014] 

在这种情况下返回所有的行。 你可以添加不同的条件。

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

然后按照上面的指示select你想要的列。 比如上面df的产品颜色和关键字,

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