猿问

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

基本上对于给定的行 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 np

import pandas as pd

pd.core.common.is_list_like = pd.api.types.is_list_like

from pandas_datareader import data as pdr

import matplotlib.pyplot as plt

import datetime

import fix_yahoo_finance as yf

yf.pdr_override() # <== that's all it takes :-)


# Dates for data

start_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.nan

df['Date'] = df.index

local_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

谢谢!


鸿蒙传说
浏览 369回答 2
2回答

侃侃无极

这个解决方案仍然有一个 for,但它减少了从df.shape[1]to的迭代量df['Local Max String'].nunique(),所以它可能足够快:for&nbsp;a_local_max&nbsp;in&nbsp;df['Local&nbsp;Max&nbsp;String'].unique(): &nbsp;&nbsp;&nbsp;&nbsp;df.loc[df['Date&nbsp;String']&nbsp;==&nbsp;a_local_max,&nbsp;'Adj']&nbsp;=&nbsp;df.loc[df['Local&nbsp;Max&nbsp;String']&nbsp;==&nbsp;a_local_max,&nbsp;'Adj&nbsp;Close'].iloc[0]
随时随地看视频慕课网APP

相关分类

Python
我要回答