如何在python pandas中添加条件计数作为新列?

时间:2017-05-20 11:59:08

标签: python pandas

我是论坛的新手。如果问到这个问题,请耐心等待。我试图用pandas实现这种类型的查询,因为mySQL速度太慢了。

update a from table_a a, table_b b
set acct_cnt = count(b.trxn)
where a.acct_id = b.acct_id
and b.trxn_dt between a.date1 and a.date2

我做了一些研究,但我唯一的结论是用熊猫实现它是非常困难的。任何人都可以给我一个如何做的暗示吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

在pandas中,这种查询不是直截了当的,因为代码定义了进程的算法,而在SQL中,代码是一个数学语句'应该执行的操作,而没有明确提到命令的顺序。

您可以通过以下方式完成任务:

假设您有2个数据框a和b:

import pandas as pd

a = pd.DataFrame([[10,'A','2016-02-01','2016-02-05'],
                  [20,'B','2016-02-01','2016-02-05'],
                  [30,'C','2016-02-01','2016-02-05']],
                 columns=['acct_id','name','date1','date2'])

b = pd.DataFrame([[10,'2016-02-02'],
                  [20,'2016-02-02'],
                  [10,'2016-01-02'],
                  [10,'2016-02-03']],
                 columns=['acct_id','trxn_dt'])

第一步是加入并计算您需要的值。 加入只能在相等条件下完成,因此我们将在第二行中应用第二个条件(之间):

joined = a.merge(b,on='acct_id')
joined = joined[joined.trxn_dt.between(joined.date1,joined.date2)]

然后你进行计数(使用分组依据)并更新:

counts = joined.groupby('acct_id').size()
a['acct_cnt'] = a.acct_id.apply(lambda x: counts.get(x,0))

最终,它总计最多4行代码,但每个代码都是一个独立的命令。