【问题标题】:How to use pandas apply instead a list loop?如何使用熊猫应用而不是列表循环?
【发布时间】:2019-03-30 23:50:21
【问题描述】:

我有一个这样的数据框:

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 中。我想使用函数 apply 来提高速度。我已经将代码转换成这样:

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 行,在包装中 raise ValueError("只能比较同名的"

ValueError: ('只能比较标签相同的系列对象', '发生在索引提供者')

谢谢

【问题讨论】:

  • @roganjosh 目前没有更多的软件包。出于测试目的,我只是在创建数据框。
  • @roganjosh 你是绝对正确的。这就是为什么在回复您之前,我编辑了我的问题以包含完整的回溯,包括 pandas 和 swifter。给您带来的不便深表歉意和感谢。我还编辑了这个问题,避免更快,只坚持熊猫应用。

标签: python pandas loops apply


【解决方案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 时的瓶颈。

【讨论】:

    【解决方案2】:

    这对我来说很有效,每个提供商在一秒钟内就有一百万个条目:

    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]
    

    【讨论】:

    • 不要不必要地使用globals()。这是一种糟糕的做法。
    • 好的,你知道如何以正确的方式创建命名的DataFrame吗?我会相应地编辑我的答案。
    • 改用数据框字典(如有必要)。
    猜你喜欢
    • 2017-06-25
    • 2021-12-11
    • 2018-10-03
    • 1970-01-01
    • 2017-04-14
    • 2023-03-17
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多