Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个单独数据帧中的数据并在Python/Pandas中生成结果_Python_Excel_Pandas_Dataframe - Fatal编程技术网

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

比较两个单独数据帧中的数据并在Python/Pandas中生成结果,python,excel,pandas,dataframe,Python,Excel,Pandas,Dataframe,我是Python新手,我正在尝试用Python和Pandas生成Excel的IndexMatch函数的类似结果,尽管我正在努力让它工作 基本上,我有两个独立的数据帧: 第一个数据帧(“market”)有7列,不过我在这个练习中只需要其中的3列(“symbol”、“date”、“close”)。此df有13948340行 第二个数据帧(“事务”)有14列,但我只需要其中的2列(“I_符号”、“接受日期”)。此df有1428026行 我的逻辑是:如果i_symbol等于symbol且验收日期等于da

我是Python新手,我正在尝试用Python和Pandas生成Excel的IndexMatch函数的类似结果,尽管我正在努力让它工作

基本上,我有两个独立的数据帧:

第一个数据帧(“market”)有7列,不过我在这个练习中只需要其中的3列(“symbol”、“date”、“close”)。此df有13948340行

第二个数据帧(“事务”)有14列,但我只需要其中的2列(“I_符号”、“接受日期”)。此df有1428026行

我的逻辑是:如果i_symbol等于symbol且验收日期等于date:打印symbol、date&close。这应该很容易

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

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

ValueError:要解压缩的值太多(应为2个)

这是我编写的代码(目前生成上述ValueError):

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)
    
    (我没有用你这样大小的数据帧测试这个,但我很确定它仍然非常慢)


    关于问题2:您可以简单地同时使用符号和日期上的数据框

    重命名“transactions”数据框,使其也包含名为“symbol”和“date”的列:

    然后合并符号和日期上的两个数据帧:

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

    结果数据帧由两个数据帧中存在的每个符号/日期组合的一行组成。在我的机器上,操作只需几秒钟,数据帧大小与您相同。

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

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

    无需循环。

    使用带有
    pandas
    /
    numpy
    的for循环是一种最后的方法,它从本质上消除了这些库的所有优点。也许有更好的方法,但我很难理解你想要实现什么。你在这里的方法是蛮力方法,难怪要花很长时间。请阅读并考虑提供一个包含预期输出的输入的小的、自包含的示例。另一方面,它听起来确实像是关系数据库的一个用例。只需合并:
    pd.merge(市场[['symbol','date','close']],交易['i_symbol','acceptance_date']],左上=['symbol','date'],右上=['i_symbol','acceptance_date'])
    。不需要循环。
     pd.merge(market[['symbol', 'date', 'close']], transactions[['i_symbol',
     'acceptance_date']], left_on=['symbol', 'date'], right_on=['i_symbol',
     'acceptance_date']).