子集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))
谢谢。
我假定Time
和Product
是DataFrame
中的列, df
是DataFrame
一个实例,其他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.loc
或query
,但我认为它有点长。
我发现你可以使用任何子集条件包装在[]给定的列。 例如,你有一个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']]