Python 如何用刮取的数据覆盖Dataframe NaN
我有一个Python 如何用刮取的数据覆盖Dataframe NaN,python,pandas,beautifulsoup,Python,Pandas,Beautifulsoup,我有一个df: Company Name Symbol CUSIP 0 Aa Inc NaN 26874784 4 Cc Inc NaN 16117M305 7 Bb Inc NaN 30734W208 我通过beautifulsoup从CUSIP查找符号。但是当我刮取符号并尝试写入df时,行仍然是NaN,而不是包含刮取的符号,如下所示: Company Name Symbol CUSI
df
:
Company Name Symbol CUSIP
0 Aa Inc NaN 26874784
4 Cc Inc NaN 16117M305
7 Bb Inc NaN 30734W208
我通过beautifulsoup从CUSIP
查找符号。但是当我刮取符号
并尝试写入df
时,行仍然是NaN
,而不是包含刮取的符号
,如下所示:
Company Name Symbol CUSIP
0 Aa Inc AIG 26874784
4 Cc Inc No Symbol 16117M305
7 Bb Inc FPAC/U 30734W208
如何将NaN
符号
替换为刮取的符号
import pandas as pd
from bs4 import BeautifulSoup as bs
import requests
import time
# Crawl Fidelity.com to find symbols for new CUSIPs
base_url = "https://quotes.fidelity.com/mmnet/SymLookup.phtml" \
"?reqforlookup=REQUESTFORLOOKUP&productid=mmnet&isLoggedIn" \
"=mmnet&rows=50&for=stock&by=cusip&criteria={}&submit=Search"
def read_symbol(cusip):
r = requests.get(base_url.format(cusip))
soup = bs(r.content, 'lxml')
symbol = soup.select_one('[href*=SID_VALUE_ID]')
return symbol.text if symbol is not None else None
for index, row in df.iterrows():
cusip = row['CUSIP']
company_name = row['Company Name']
for zeroes in range(3):
symbol = read_symbol(zeroes * "0" + cusip)
row['Symbol'] = 'No Symbol' if symbol is None else symbol
if symbol is not None:
break
print(str(symbol) + " is the symbol for " + str(company_name) + " (CUSIP #: " + str(cusip) + ")")
time.sleep(3)
print(df)
CUSIP列必须显式读取为字符串列。以便保留前导零。此外,您还可以使用填充零,因为CUSIP
number始终是9位数字
df['CUSIP'] = df['CUSIP'].astype(str).str.zfill(9)
从BeatifulSoup构造函数中删除lxml解析器
def read_symbol(cusip):
r = requests.get(base_url.format(cusip))
soup = bs(r.content, 'html.parser')
symbol = soup.select_one('[href*=SID_VALUE_ID]')
return symbol.text if symbol is not None else np.nan
使用map和fillna
df['Symbol'] = df['CUSIP'].map(read_symbol).fillna('No Symbol')
输出
Company Name Symbol CUSIP
0 Aa Inc AIG 026874784
4 Cc Inc No Symbol 16117M305
7 Bb Inc FPAC/U 30734W208
CUSIP列必须显式读取为字符串列。以便保留前导零。此外,您还可以使用填充零,因为CUSIP
number始终是9位数字
df['CUSIP'] = df['CUSIP'].astype(str).str.zfill(9)
从BeatifulSoup构造函数中删除lxml解析器
def read_symbol(cusip):
r = requests.get(base_url.format(cusip))
soup = bs(r.content, 'html.parser')
symbol = soup.select_one('[href*=SID_VALUE_ID]')
return symbol.text if symbol is not None else np.nan
使用map和fillna
df['Symbol'] = df['CUSIP'].map(read_symbol).fillna('No Symbol')
输出
Company Name Symbol CUSIP
0 Aa Inc AIG 026874784
4 Cc Inc No Symbol 16117M305
7 Bb Inc FPAC/U 30734W208
你的问题不清楚!我已经移动到您提到的url,但它没有提供您所展示的输出。我认为您可以这样做:df['Symbol']=df['CUSIP'].str.zfill(9).map(read_Symbol)
返回['AIG',nan',FPAC/U']
您的问题不清楚!我已经移动到您提到的url,但它没有提供您演示的输出。我认为您可以这样做:df['Symbol']=df['CUSIP'].str.zfill(9).map(read_Symbol)
返回['AIG',nan',FPAC/U']
谢谢@jezrael的帮助。谢谢。我可能仍然需要sleep
函数,以避免我正在抓取的url过载,因此我应该将其粘贴在return
语句之前吗?另外,当我删除lxml解析器时,我会得到一个警告UserWarning:没有明确指定解析器……要消除此警告,请将附加参数'features=“lxml”'传递给BeautifulSoup构造函数。
我知道我可以忽略此问题,但是保留lxml解析器以抑制警告有什么害处吗?更新答案@MSD,是的,您可以在返回之前睡觉。谢谢@jezrael的帮助。谢谢。我可能仍然需要sleep
函数,以避免我正在抓取的url过载,因此我应该将其粘贴在return
语句之前吗?另外,当我删除lxml解析器时,我会得到一个警告UserWarning:没有明确指定解析器……要消除此警告,请将附加参数'features=“lxml”'传递给BeautifulSoup构造函数。
我知道我可以忽略此问题,但是保留lxml解析器以抑制警告有什么害处吗?更新了answer@MSD,是的,您可以在返回之前睡觉。