如何在熊猫数据框中将函数应用于一列的每一行?

时间:2020-05-18 02:55:41

标签: python pandas function dataframe apply

我有一个股票价格为{600,长度为〜600k的数据框,df,是我从here下载的。

enter image description here

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

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'

现在,我想用相应的股票代码的公司名称填充“名称”列。为此,我编写了以下lambda函数:

df.Name = df.Ticker.apply(lambda x: return_company_name(x))

但是这最后一行代码仍在继续运行。有什么问题吗?如果是,该如何解决?

我用map而不是apply尝试了相同的方法,但结果相同。

3 个答案:

答案 0 :(得分:1)

首先,您不需要lambdaapply

 df.Name = df.Ticker.map(return_company_name)

更好。其次,正如其他人所指出的那样,这是非常低效的。即使您的股票行情小得多,您也要拨打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]

然后在代码栏上映射my_return。

答案 1 :(得分:0)

从yfinance上查看源代码,您可以看到here get_info方法调用_get_fundamentals,这反过来似乎对不同站点做了一些 调用,以获取所需的信息。

由于这是针对每一行执行的,因此您会遇到一些麻烦,因为网站可能会限制您的访问速度。 也许您可以迈出第一步,获取所有唯一的名称,然后查找一次,然后将它们保存在某种形式的CSV或类似格式的

答案 2 :(得分:0)

您可以使用pandas.apply()将函数应用于Dataframe中的每一行/列。

您还可以对每列使用lambda函数。例如:
modDfObj = dfObj.apply(lambda x : x + 10)


另一个示例(此处,仅将函数应用于列z):

modDfObj = dfObj.apply(lambda x: np.square(x) if x.name == 'z' else x)