我有一个关于选择熊猫行的问题。让我们来看下面的例子:
df = pd.DataFrame({
'Branch' : 'A A A A A B'.split(),
'Buyer': 'Carl Mark Carl Joe Mark Carl'.split(),
'Quantity': [1,3,5,8,9,3],
'Date' : [
DT.datetime(2013,9,1,13,0),
DT.datetime(2013,9,1,13,5),
DT.datetime(2013,10,1,20,0),
DT.datetime(2013,10,3,10,0),
DT.datetime(2013,12,2,12,0),
DT.datetime(2013,12,2,14,0),
]})
我想有效地查找“卡尔”和“马克”购买了包括相应购买日期在内的商品的那些日子。像这样
Date_1 Buyer_1 Date Buyer
Day
2013-09-01 2013-09-01 13:00:00 Carl 2013-09-01 13:05:00 Mark
2013-12-02 2013-12-02 14:00:00 Carl 2013-12-02 12:00:00 Mark
为此,我目前正在使用以下代码:
df['Day'] = df.Date.map(lambda t: t.date())
df = df.set_index('Day')
day1 = df[df.Buyer == 'Carl'][['Date', 'Buyer']]
day2 = df[df.Buyer == 'Mark'][['Date', 'Buyer']]
test1 = day1.join(day2, lsuffix='_1')
test1 = test1.dropna()
但是,此代码无法正常执行(timeit.timeit(mytest,number = 1000))〜4s
有谁知道如何提高此计算的性能并保持可读性?
我将不胜感激任何帮助。
安迪
最佳答案
试试这个:
In [69]: df[df['Buyer'].isin(['Carl', 'Mark'])].set_index('Buyer', append=True)[['Date']].unstack(['Buyer'])
Out[69]:
Date
Buyer Carl Mark
Day
2013-09-01 2013-09-01 13:00:00 2013-09-01 13:05:00
2013-10-01 2013-10-01 20:00:00 NaT
2013-12-02 2013-12-02 14:00:00 2013-12-02 12:00:00
关于python - Pandas :等效于SQL-HAVING语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17523735/