Python 如何将函数应用于数据帧中一列的每一行?

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,长度约为600k,我从下载

我已将最后一列名称从“name”重命名为“ticks”,并创建了一个名为“name”的新空白列:

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]