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

时间:2017-03-31 22:01:16

标签: python excel pandas dataframe

我是Python的新手,我正在尝试使用Python和Excel生成Excel的IndexMatch函数的类似结果。熊猫,虽然我很难让它发挥作用。

基本上,我有2个单独的DataFrame:

第一个DataFrame('market')有7列,但我只需要其中3列进行此练习('symbol','date','close')。这个df有13,948,340行。

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

我的逻辑是:如果i_symbol等于symbol,且acceptance_date等于date:print symbol,date&关。这应该很容易。

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

基于我在线阅读的内容,迭代应该是一种更快的方法,但我目前收到错误:

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)吗?
  3. 谢谢,马特

2 个答案:

答案 0 :(得分:1)

关于问题1: pandas.itertuples()为每一行产生一个namedtuple。您可以像标准元组一样解压缩这些元组,也可以按名称访问元组元素:

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)

(我没有使用您的尺寸的数据框进行测试,但我很确定它仍然很慢)

关于问题2:您可以在符号和日期上简单地merge数据框。

重命名您的"交易" DataFrame,它也有名为" symbol"的列。和"日期":

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

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

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

结果DataFrame由两个DataFrame中存在的每个符号/日期组合组成一行。使用您的尺寸的DataFrames,我的机器上的操作只需几秒钟。

答案 1 :(得分:0)

@Parfait在下面提供了最佳答案作为评论。很干净,工作速度非常快 - 谢谢。

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

无需循环。