为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas Dataframe:对于给定的行,尝试根据对另一列中值的查找来分配特定列中的值

Pandas Dataframe:对于给定的行,尝试根据对另一列中值的查找来分配特定列中的值

鸿蒙传说 2021-08-24 18:04:38
基本上对于给定的行 i,我试图根据 i 在另一列“本地最大字符串”中的值将 i 在列“Adj”中的值分配给某个值。基本上,需要在 DataFrame 的另一列“日期字符串”中搜索“本地最大字符串”中第 i 行的值,然后在包含该值的行 q 中将其值放在“调整关闭”列中第 i 行的“Adj”列的值。对不起,如果这很难理解。下面的 for 循环完成了我想做的事情,但我认为在 Pandas 中应该有更好的方法来做到这一点。我尝试使用 apply 和 lambda 函数,但它说不可能进行赋值,而且我不确定我的做法是否正确。for 循环也需要很长时间才能完成。这是代码:for x in range(0, len(df.index)):     df['Adj'][x] = df.loc[df['Date String'] == df['Local Max String'][x]]['Adj Close']这是 DF 的图片,可以更好地理解我的意思。Adj 列中的值将查找与 Local Max String 中的 Date 相对应的 Adj Close 值。import numpy as npimport pandas as pdpd.core.common.is_list_like = pd.api.types.is_list_likefrom pandas_datareader import data as pdrimport matplotlib.pyplot as pltimport datetimeimport fix_yahoo_finance as yfyf.pdr_override() # <== that's all it takes :-)# Dates for datastart_date = datetime.datetime(2017,11,1)end_date = datetime.datetime(2018,11,1)df = pdr.get_data_yahoo('SPY', start=start_date, end=end_date)df.data = df['Adj Close']df['Most Recent Local Max'] = np.nandf['Date'] = df.indexlocal_maxes = list(df[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)].index)local_maxes.append(df['Date'][0] - datetime.timedelta(days=1))def nearest(items, pivot):    return min([d for d in items if d< pivot], key=lambda x: abs(x - pivot))df['Most Recent Local Max'] = df['Date'].apply(lambda x: min([d for d in local_maxes if d < x], key=lambda y: abs(y - x)) )df['Local Max String'] = df['Most Recent Local Max'].apply(lambda x: str(x))df['Date String'] = df['Date'].apply(lambda x: str(x))df.loc[df['Local Max String'] == str(df['Date'][0] - datetime.timedelta(days=1)), 'Local Max String'] = str(df['Date'][0])df['Adj'] = np.nan谢谢!
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

这个解决方案仍然有一个 for,但它减少了从df.shape[1]to的迭代量df['Local Max String'].nunique(),所以它可能足够快:

for a_local_max in df['Local Max String'].unique():
    df.loc[df['Date String'] == a_local_max, 'Adj'] = df.loc[df['Local Max String'] == a_local_max, 'Adj Close'].iloc[0]



查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 368 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号