我正在从R过渡到Python。我刚刚开始使用熊猫。我有一个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..
我开始觉得我这样做是错误的。或许,有一个优雅的解决方案。有人可以帮忙吗?我需要从我的时间戳中提取月份和年份并进行子集化。也许有一个单行班将完成所有这些:
k1 <- subset(data, Product = p.id & Time >= start_time & Time < end_time, select = c(Time, Product))
感谢。
答案 0 :(得分:86)
我假设Time
和Product
是DataFrame
中的列,df
是DataFrame
的实例,其他变量是标量值:
目前,您必须引用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')
答案 1 :(得分:20)
仅针对寻找更类似于R的解决方案的人:
df[(df.Product == p_id) & (df.Time> start_time) & (df.Time < end_time)][['Time','Product']]
不需要data.loc
或query
,但我认为它有点长。
答案 2 :(得分:12)
我发现您可以通过将其包装在[]中来使用给定列的任何子集条件。例如,您有一个带有列的df [&#39;产品&#39;,&#39;时间&#39;&#39;年&#39;&#39;颜色&#39;]
让我们说你想要包括2014年之前制作的产品。你可以写,
df[df['Year'] < 2014]
返回这种情况下的所有行。您可以添加不同的条件。
df[df['Year'] < 2014][df['Color' == 'Red']
然后根据上面的指示选择您想要的列。例如,上面df的产品颜色和键,
df[df['Year'] < 2014][df['Color' == 'Red'][['Product','Color']]
答案 3 :(得分:0)
我正在从R过渡到Python
k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product))
关于先前答案中提到的一些要点,并提高了可读性:
不需要data.loc或查询,但我确实认为它有点长。
由于&运算符与比较运算符之间的优先级,因此括号也是必需的。
我喜欢这样写这样的表达式-括号更少,键入更快,更易于阅读。也更接近R。
q_product = df.Product == p_id
q_start = df.Time > start_time
q_end = df.Time < end_time
df.loc[q_product & q_start & q_end, c('Time,Product')]
# c is just a convenience
c = lambda v: v.split(',')
答案 4 :(得分:-1)
创建一个具有已知列名的空数据框:
Names = ['Col1','ActivityID','TransactionID']
df = pd.DataFrame(columns = Names)
通过 csv 创建数据框:
df = pd.DataFrame('...../file_name.csv')
创建动态过滤器以对dtaframe
进行子集化:
i = 12
df[df['ActivitiID'] <= i]
创建动态过滤器以对dtaframe所需列进行子集
df[df['ActivityID'] == i][['TransactionID','ActivityID']]