如何使用熊猫应用列表循环?

时间:2018-10-26 08:52:35

标签: python pandas loops apply

我有一个这样的数据框:

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对象”,   '发生在索引提供者')

谢谢

2 个答案:

答案 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:导出到csvcsv.gzpkl都将大大提高效率。对于大型数据集,导出到Excel时,过滤数据框不太可能成为瓶颈。