我是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个问题:
谢谢,马特
答案 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']).
无需循环。