我有一个这样的数据框:
df = pd.DataFrame({'market':['ES','UK','DE'],
'provider':['A','B','C'],
'item':['X','Y','Z']})
然后我有一个提供者列表和以下循环:
providers_list = ['A','B','C']
for provider in providers_list:
a = df.loc[df['provider']==provider]
该循环为每个提供程序创建一个数据框,稍后我将其放入Excel。我想使用该功能适用于速度目的。我已经转换了这样的代码:
providers_list = pd.DataFrame({'provider':['A','B','C']})
def report(provider):
a = df.loc[df['provider']==provider]
providers_list.apply(report)
文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ ops.py”, 1190行,在包装器中 引发ValueError(“只能比较标记相同的”
ValueError :(“只能比较标记相同的Series对象”, '发生在索引提供者')
谢谢
答案 0 :(得分:1)
这对我很有效,在一秒钟之内每个供应商都有一百万个条目:
import pandas as pd
from tqdm import tqdm
tqdm.pandas(desc="Progress:")
df = pd.DataFrame({'market':['ES','UK','DE']*1000000,
'provider':['A','B','C']*1000000,
'item':['X','Y','Z']*1000000})
grouped = df.groupby("provider")
providers_list = ['A','B','C']
for prov in tqdm(providers_list):
frame_name = prov
globals()[frame_name] = pd.DataFrame(grouped.get_group(prov))
print(A)
print(B)
print(C)
100%|██████████| 3/3 [00:00<00:00, 9.59it/s]
答案 1 :(得分:1)
apply
方法通常效率低下。它不过是带有一些额外功能的美化循环。相反,您可以使用GroupBy
来循环浏览每个provider
:
for prov, df_prov in df.groupby('provider'):
df_prov.to_excel(f'{prov}.xlsx', index=False)
如果只想在输出中包括预定义 list
个提供者,则可以定义一个GroupBy
对象并迭代列表:
providers_list = ['A', 'B', 'C']
grouper = df.groupby('provider')
for prov in providers_list:
grouper.get_group(prov).to_excel(f'{prov}.xlsx', index=False)
如果您对整个过程的速度感兴趣,强烈建议您不要使用Excel:导出到csv
,csv.gz
或pkl
都将大大提高效率。对于大型数据集,导出到Excel时,过滤数据框不太可能成为瓶颈。