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

2024-04-19 23:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

第一个数据帧('market')有7列,不过我只需要其中的3列来进行这个练习('symbol'、'date'、'close')。这个df有13948340行。你知道吗

第二个数据帧('transactions')有14列,但只有我只需要其中的2列('I\u symbol','acceptance\u date')。这个df有1428026行。你知道吗

我的逻辑是:如果i\u symbol等于symbol并且acceptance\u date等于date:print symbol,date&close。这应该很容易。你知道吗

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

根据我在网上读到的内容,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)吗?你知道吗

谢谢,马特


Tags: 数据方法indfforclosedateindex
2条回答

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

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

不需要循环。你知道吗

关于问题1:熊猫.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'])

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

相关问题 更多 >