python - Pandas:SQL-HAVING 语句的高效等效项

标签 python performance pandas

我有一个关于 pandas 中行选择的问题。让我们看下面的例子:

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),
    ]})

我想有效地找到“Carl”“Mark”购买东西的日子,包括相应的购买日期。比如像这样

                     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/

相关文章:

python - 将包含带有标记部分的 OrderedDict 的元组转换为包含以标记部分命名的列的表

python - 字典迭代——对于 dict 与 dict.items()

python - 打开一个 25GB 的文本文件进行处理

sql - 更新SQL表非常慢

java - 为什么java内置序列化比Gson差?

python - 在 python 中将字符串转换为 float 时遇到问题

python - Series 对象没有 split 属性 - 从文本文件读取数据

python - OpenCV 2.4 VideoCapture 在 Windows 上不起作用

python - 为什么我的函数会覆盖作为参数传递的列表?

python - 通过键从不同列获取值