如何在遍历 pandas 数据框时显示进度条
How can you show progress bar while iterating over a pandas dataframe
我正在尝试迭代具有近一百万个条目的 Pandas 数据框。我正在使用 for 循环迭代它们。以下面的代码为例
import pandas as pd
import os
from requests_html import HTMLSession
from tqdm import tqdm
import time
df = pd.read_csv(os.getcwd()+'/test-urls.csv')
df = df.drop('Unnamed: 0', axis=1 )
new_df = pd.DataFrame(columns = ['pid', 'orig_url', 'hosted_url'])
refused_df = pd.DataFrame(columns = ['pid', 'refused_url'])
tic = time.time()
for idx, row in df.iterrows():
img_id = row['pid']
url = row['image_url']
#Let's do scrapping
session = HTMLSession()
r = session.get(url)
r.html.render(sleep=1, keep_page=True, scrolldown=1)
count = 0
link_vals = r.html.find('.zoomable')
if len(link_vals) != 0 :
attrs = link_vals[0].attrs
# print(attrs['src'])
embed_link = attrs['src']
else:
while count <=7:
link_vals = r.html.find('.zoomable')
count += 1
else:
print('Link refused connection for 7 tries. Adding URL to Refused URLs Data Frame')
ref_val = [img_id,URL]
len_ref = len(refused_df)
refused_df.loc[len_ref] = ref_val
print('Refused URL added')
continue
print('Got 1 link')
#Append scraped data to new_df
len_df = len(new_df)
append_value = [img_id,url, embed_link]
new_df.loc[len_df] = append_value
我想知道如何使用进度条来添加进度条的可视化表示。我将不胜感激任何帮助。如果您需要任何说明,请告诉我。
会发表评论,但您可能想要进度条的原因是它需要很长时间,因为 iterrows() 是 pandas 中执行操作的缓慢方法。
我建议您使用应用/避免使用 iterrows()。
如果您想继续使用 iterrows,只需包含一个计数器,它可以计算行数,df.shape[0]
你可以试试TQDM
from tqdm import tqdm
for idx, row in tqdm(df.iterrows()):
do something
这主要用于命令行进度条。如果您正在寻找更多的 GUI,还有其他解决方案。 PySimpleGUI 想到了,但肯定有点复杂。
PySimpleGUI 使这个问题尽可能简单地解决,假设您提前知道列表中的项目。不确定的进度表是可能的,但有点复杂。
循环之前不需要任何设置。您不需要制作特殊的迭代器。您唯一需要做的就是在循环中添加 1 行代码。
在您的循环中添加对 - one_line_progress_meter
的调用。这个名字总结了它是什么。将此调用添加到循环的顶部、底部,没关系...只需将其添加到循环的某个位置即可。
您传递的 4 个参数是:
- 要放在仪表上的标题(任何字符串都可以)
- 您现在所在的位置 - 当前计数器
- 最大计数器值是多少
- “密钥”- 唯一的字符串、数字,任何你想要的东西。
这里有一个遍历整数列表的循环来演示。
import PySimpleGUI as sg
items = list(range(1000))
total_items = len(items)
for index, item in enumerate(items):
sg.one_line_progress_meter('My meter', index+1, total_items, 'my meter' )
列表迭代代码将是您的循环代码。您要添加的代码行是这一行:
sg.one_line_progress_meter('My meter', index+1, total_items, 'my meter' )
这行代码将显示下面的 window。它包含统计信息,例如您已经 运行 循环了多长时间,以及对您还需要多长时间的估计。
如何在pandas申请?
我这样做
def some_func(a,b):
global index
some function involve a and b
index+=1
sg.one_line_progress_meter('My meter', index, len(df), 'my meter' )
return c
index=0
df['c'] = df[['a','b']].apply(lambda : some_func(*x),axis=1)
我正在尝试迭代具有近一百万个条目的 Pandas 数据框。我正在使用 for 循环迭代它们。以下面的代码为例
import pandas as pd
import os
from requests_html import HTMLSession
from tqdm import tqdm
import time
df = pd.read_csv(os.getcwd()+'/test-urls.csv')
df = df.drop('Unnamed: 0', axis=1 )
new_df = pd.DataFrame(columns = ['pid', 'orig_url', 'hosted_url'])
refused_df = pd.DataFrame(columns = ['pid', 'refused_url'])
tic = time.time()
for idx, row in df.iterrows():
img_id = row['pid']
url = row['image_url']
#Let's do scrapping
session = HTMLSession()
r = session.get(url)
r.html.render(sleep=1, keep_page=True, scrolldown=1)
count = 0
link_vals = r.html.find('.zoomable')
if len(link_vals) != 0 :
attrs = link_vals[0].attrs
# print(attrs['src'])
embed_link = attrs['src']
else:
while count <=7:
link_vals = r.html.find('.zoomable')
count += 1
else:
print('Link refused connection for 7 tries. Adding URL to Refused URLs Data Frame')
ref_val = [img_id,URL]
len_ref = len(refused_df)
refused_df.loc[len_ref] = ref_val
print('Refused URL added')
continue
print('Got 1 link')
#Append scraped data to new_df
len_df = len(new_df)
append_value = [img_id,url, embed_link]
new_df.loc[len_df] = append_value
我想知道如何使用进度条来添加进度条的可视化表示。我将不胜感激任何帮助。如果您需要任何说明,请告诉我。
会发表评论,但您可能想要进度条的原因是它需要很长时间,因为 iterrows() 是 pandas 中执行操作的缓慢方法。
我建议您使用应用/避免使用 iterrows()。
如果您想继续使用 iterrows,只需包含一个计数器,它可以计算行数,df.shape[0]
你可以试试TQDM
from tqdm import tqdm
for idx, row in tqdm(df.iterrows()):
do something
这主要用于命令行进度条。如果您正在寻找更多的 GUI,还有其他解决方案。 PySimpleGUI 想到了,但肯定有点复杂。
PySimpleGUI 使这个问题尽可能简单地解决,假设您提前知道列表中的项目。不确定的进度表是可能的,但有点复杂。
循环之前不需要任何设置。您不需要制作特殊的迭代器。您唯一需要做的就是在循环中添加 1 行代码。
在您的循环中添加对 - one_line_progress_meter
的调用。这个名字总结了它是什么。将此调用添加到循环的顶部、底部,没关系...只需将其添加到循环的某个位置即可。
您传递的 4 个参数是:
- 要放在仪表上的标题(任何字符串都可以)
- 您现在所在的位置 - 当前计数器
- 最大计数器值是多少
- “密钥”- 唯一的字符串、数字,任何你想要的东西。
这里有一个遍历整数列表的循环来演示。
import PySimpleGUI as sg
items = list(range(1000))
total_items = len(items)
for index, item in enumerate(items):
sg.one_line_progress_meter('My meter', index+1, total_items, 'my meter' )
列表迭代代码将是您的循环代码。您要添加的代码行是这一行:
sg.one_line_progress_meter('My meter', index+1, total_items, 'my meter' )
这行代码将显示下面的 window。它包含统计信息,例如您已经 运行 循环了多长时间,以及对您还需要多长时间的估计。
如何在pandas申请? 我这样做
def some_func(a,b):
global index
some function involve a and b
index+=1
sg.one_line_progress_meter('My meter', index, len(df), 'my meter' )
return c
index=0
df['c'] = df[['a','b']].apply(lambda : some_func(*x),axis=1)