繁体   English   中英

如何将 function 应用于 pandas dataframe 中一列的每一行?

[英]How to apply a function to each row of one column in a pandas dataframe?

我有一个 dataframe df的股票价格,长度约为 600k,我从这里下载。

在此处输入图像描述

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

df = df.rename(columns={'Name': 'Ticker'})
df['Name'] = ''

我编写了以下 function 以返回给定股票代码的公司名称:

! 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 function:

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

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

我尝试使用map而不是apply ,但结果相同。

首先,您不需要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]

然后 map my_return 在您的股票行情上。

查看来自 yfinance 的源代码,您可以在此处看到get_info方法调用_get_fundamentals ,这反过来似乎对不同站点进行了很多API 调用以获取所需的信息。

由于这是针对每一行执行的,因此您会遇到一些麻烦,因为站点可能会限制您。 也许您可以先获取所有唯一名称,然后查找它们一次并将它们保存在某种查找 CSV 等中

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

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


另一个例子(这里,它只将 function 应用于z列):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM