For循环在另一个数据帧中查找行

2024-03-29 05:06:03 发布

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

我有两个数据框:一个是每日股价(例如所有美国股票),另一个是指数的历史成分(例如标准普尔500)

我设法创建了一个for循环,检查每只股票,每天是否都是指数的一部分。然而,循环可能需要很长时间才能完成,因为每日价格DF有65000.000行,历史成分DF有15000行。我只尝试了DF的一些子集,代码满足了我的需要,但需要几天才能完成。循环的速度随着迭代次数的增加而逐渐降低,所以我认为我做的事情可能效率很低

DF1:收盘价

  ticker date  price
1 AAPL   2018  150.10
2 AAPL   2019  220.50
3 MSFT   2018  50.60
4 MSFT   2019  70.90

DF2:成分

  ticker date
1 AMZN   2018
2 AAPL   2018
3 FB     2018
3 AMZN   2019
4 AAPL   2019
5 MSFT   2019

预期结果:

  ticker date  price   in_index
1 AAPL   2018  150.10  yes
2 AAPL   2019  220.50  yes
3 MSFT   2018  50.60   no
4 MSFT   2019  70.90   yes

因此,2018年AAPL是指数的一部分,而MSFT则不是。2019年,AAPL和MSFT都是该指数的一部分

这是我的密码:

DF1['in_index'] = "no"

for row in range(len(DF1)):

    ticker = DF1.loc[row].ticker
    year = DF1.loc[row].year

    aux = DF2[(DF2.tic==ticker) & (DF2.year==year)]


    if len(aux) > 0:
        DF1['in_index'].loc[row] = 1

有没有办法让这个循环更有效


Tags: indfdateindex指数yearlocyes
2条回答

使用pandas.DataFrame.merge的一种方法:

new_df = df.merge(df2.assign(in_index="yes"), 
                  on=['ticker','date'], how='left').fillna({'in_index':'no'})
print(new_df)

输出:

  ticker  date  price in_index
0   AAPL  2018  150.1      yes
1   AAPL  2019  220.5      yes
2   MSFT  2018   50.6       no
3   MSFT  2019   70.9      yes

^{}indicator = True^{}连用 利用_merge

new_df = (df1.merge(df2,on = ['ticker','date'],how = 'left',indicator = 'in_index')
             .replace({'in_index':{'both':'yes','left_only':'no'}})
             )
print(new_df)
  ticker  date  price in_index
0   AAPL  2018  150.1      yes
1   AAPL  2019  220.5      yes
2   MSFT  2018   50.6       no
3   MSFT  2019   70.9      yes

相关问题 更多 >