Pandas DataFrame Speed - PullRequest
       2

Pandas DataFrame Speed

0 голосов
/ 08 октября 2018

enter image description here

Итак, у меня есть предыдущий фрейм данных, к которому я хочу добавить новый столбец с именем "dload", которого я добиваю путем кодирования df ["dload"] = np.nan

Затем я хочу заполнить значение nan значениями этой функции:

def func_ret_value(soup,tables):
    for td in tables[40].findAll("td"):
       if td.text == "Short Percent of Float":
          value = list(td.next_siblings)[1].text.strip("%")
        #print(value)
    return value

Для этого я напишу следующий код:

for index in df.index:
#     print(index,row)
#     print(index,df.iloc[index]["Symbol"])
   r = requests.get(url_pre+df.iloc[index]["Symbol"]+url_suf)
   soup = BeautifulSoup(r.text,"html.parser")
   tables = soup.findAll("table")
   #print(row["dload"])
   df.loc[index,"dload"] = func_ret_value(soup,tables)

Есть ли какие-нибудь итерроу илиподать заявку, это более быстрый способ сделать это?

Спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

Вы могли бы использовать apply(), но я бы предположил, что наиболее вычислительной частью вашего кода являются ваши HTTP-запросы (как упомянул @Peter Leimbigler в своем комментарии).Вот пример с вашей функцией:

def func_ret_value(x):

    r = requests.get(url_pre + x['Symbol'] + url_suf)
    soup = BeautifulSoup(r.text, 'html.parser')
    tables = soup.findAll('table')
    for td in tables[40].findAll("td"):
       if td.text == "Short Percent of Float":
          return list(td.next_siblings)[1].text.strip("%")

df['dload'] = df.apply(func_ret_value, axis=1)

Обратите внимание, что axis=1 указывает, что вы будете применять эту функцию построчно.

Вы также можете рассмотреть возможность реализации некоторой обработки ошибок здесь, вслучай, когда ваш оператор if внутри вашей функции func_ret_value() никогда не срабатывает для данной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...