Python 如何将函数应用于数据帧中一列的每一行?
我有一个股票价格的数据帧df,长度约为600k,我从下载 我已将最后一列名称从“name”重命名为“ticks”,并创建了一个名为“name”的新空白列:Python 如何将函数应用于数据帧中一列的每一行?,python,pandas,function,dataframe,apply,Python,Pandas,Function,Dataframe,Apply,我有一个股票价格的数据帧df,长度约为600k,我从下载 我已将最后一列名称从“name”重命名为“ticks”,并创建了一个名为“name”的新空白列: df = df.rename(columns={'Name': 'Ticker'}) df['Name'] = '' 我编写了以下函数来返回给定股票代码的公司名称: ! pip3 install yfinance import yfinance as yf def return_company_name(ticker): retu
df = df.rename(columns={'Name': 'Ticker'})
df['Name'] = ''
我编写了以下函数来返回给定股票代码的公司名称:
! pip3 install yfinance
import yfinance as yf
def return_company_name(ticker):
return yf.Ticker(ticker).info['longName']
return_company_name('MSFT')
>>> 'Microsoft Corporation'
现在,我想用相应股票代码的公司名称填充“Name”列。为此,我编写了以下lambda函数:
df.Name = df.Ticker.apply(lambda x: return_company_name(x))
但这最后一行代码一直在运行。有什么不对劲吗?如果是,如何修复
我用map而不是apply尝试了同样的方法,但结果是一样的。从yfinance查看源代码,您可以看到 get_info方法调用,而这又似乎对不同的站点进行了相当多的API调用,以获取它所需要的信息 因为这是针对每一行执行的,所以您会遇到一些问题,因为站点可能会限制您的费率。 也许您可以先获取所有唯一的名称,然后查找一次,并将它们保存在某种查找CSV或类似文件中。您可以使用pandas.apply将函数应用于数据帧中的每一行/列 您还可以对每列使用lambda函数。例如: modDfObj=dfObj.applylambda x:x+10 这里的另一个示例是,它仅将函数应用于z列: modDfObj=dfObj.applylambda x:np.squarex如果x.name=='z'else x首先,您不需要lambda或apply 这样更好。第二,正如其他人所指出的那样,这种做法效率低下得离谱。你打了600000次电话,尽管你的票务数量要少得多。以下大锤方法将起作用:
class my_return():
def __init__(self):
self.tickdict = {}
def __call__(self, ticker):
ans = self.tickdict.get(ticker, None)
if ans is not None:
return ans
else:
self.tickdict[ticker] = return_company_name(ticker)
return self.tickdict[ticker]
然后将我的返回映射到您的ticker列。将df.ticker更改为df.Name?
class my_return():
def __init__(self):
self.tickdict = {}
def __call__(self, ticker):
ans = self.tickdict.get(ticker, None)
if ans is not None:
return ans
else:
self.tickdict[ticker] = return_company_name(ticker)
return self.tickdict[ticker]