比较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个问题:
- itertuples()是最好还是最快的方法? 如果是这样,我怎么能得到上述的工作?
- 有谁知道更好的方法? 索引工作? 我应该使用外部数据库(例如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']).
无需循环。