[英]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
,但结果相同。
首先,您不需要lambda
或apply
。
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.