比较2个独立DataFrame中的数据,并在Python / Pandas中生成结果

我是Python的新手,我试图用Python和Pandas产生Excel的IndexMatch函数类似的结果,尽pipe我正在努力使它工作。

基本上,我有2个独立的dataframe:

第一个数据框(“市场”)有7列,但我只需要这些练习(“符号”,“date”,“closures”)的列中的3。 这个DF有13948340行。

第二个DataFrame('transactions')有14列,但我只需要其中的2列('i_symbol','acceptance_date')。 这个DF有1,428,026行。

我的逻辑是:如果i_symbol等于符号,并且acceptance_date等于date:打印符号,date和closures。 这应该很容易。

我用iterrows()实现了它,但由于数据集的大小,它每3分钟返回一个结果 – 这意味着我将不得不运行脚本1,190小时以获得最终结果。

根据我在网上阅读的内容,itertuples应该是一个更快的方法,但我目前得到一个错误:

ValueError:解压缩的值太多(预计2)

这是我写的代码(目前产生上面的ValueError):

for i_symbol, acceptance_date in transactions.itertuples(index=False): for symbol, date in market.itertuples(index=False): if i_symbol == symbol and acceptance_date == date: print(market.symbol + market.date + market.close) 

2个问题:

  1. itertuples()是最好还是最快的方法? 如果是这样,我怎么能得到上述的工作?
  2. 有谁知道更好的方法? 索引工作? 我应该使用外部数据库(例如MySQL)吗?

谢谢,Matt

关于问题1: pandas.itertuples()为每一行生成一个命名的元组。 你可以解压这些类似的标准元组或者按名称访问元组元素:

 for t in transactions.itertuples(index=False): for m in market.itertuples(index=False): if t.i_symbol == m.symbol and t.acceptance_date == m.date: print(m.symbol + m.date + m.close) 

(我没有testing这与你的大小的dataframe,但我很确定它仍然是痛苦的缓慢)

关于问题2:您可以简单地在符号和date上merge两个dataframe。

重命名您的“交易”数据框,以便它也有名为“符号”和“date”的列:

 transactions = transactions[['i_symbol', 'acceptance_date']] transactions.columns = ['symbol','date'] 

然后在符号和date上合并两个DataFrame:

 result = pd.merge(market, transactions, on=['symbol','date']) 

结果DataFrame包含两个DataFrame中存在的每个符号/date组合的一行。 我的机器上的操作只需要几秒钟就可以处理大小的DataFrame。

@Parfait作为评论提供了最好的答案。 非常干净,工作非常快 – 谢谢你。

  pd.merge(market[['symbol', 'date', 'close']], transactions[['i_symbol', 'acceptance_date']], left_on=['symbol', 'date'], right_on=['i_symbol', 'acceptance_date']). 

无需循环。