Pandas 熊猫是一种可供选择的性能?

Pandas 熊猫是一种可供选择的性能?,pandas,dataframe,Pandas,Dataframe,试图在这个GroupBy上提高速度,并提出用更快的代码替换它的想法 目标是创建一个“规范化名称”列,这是基于“位置ID”最频繁出现的列。如何以更有效的方式实现相同的结果 这是我的入门数据框架: Company Name Location ID 0 jones LLC F55555JONE 1 jones LLC F55555JONE 2 jones F55555JONE 3 alpha Co F11111AL

试图在这个GroupBy上提高速度,并提出用更快的代码替换它的想法

目标是创建一个“规范化名称”列,这是基于“位置ID”最频繁出现的列。如何以更有效的方式实现相同的结果

这是我的入门数据框架:

    Company Name    Location ID
0   jones LLC       F55555JONE
1   jones LLC       F55555JONE
2   jones           F55555JONE
3   alpha Co        F11111ALPH
4   alpha Co        F11111ALPH
5   alpha           F11111ALPH
以下是使用timeit的两个工作版本:

df.groupby(["Location ID"])["Company Name"].agg(lambda x: Counter(x).most_common(1)[0][0]).reset_index()
13.2 ms ± 358 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


df.groupby(["Location ID"])["Company Name"].apply(lambda x: x.value_counts().index[0]).reset_index()
# 5.22 ms ± 75.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
输出

    Location ID Company Name
0   F11111ALPH  alpha Co
1   F55555JONE  jones LLC

我看到移除计数器的速度提高了大约两倍,但是我在10万行上运行这个,并且认为GroupBy需要去吗?谢谢

我们试试
模式

df.groupby(["Location ID"],as_index=False)[["Company Name"]].agg(lambda x: x.mode().iloc[0])
  Location ID Company Name
0  F11111ALPH      alphaCo
1  F55555JONE     jonesLLC

我认为
apply
真的让事情变慢了。尝试这个替代方案,在这里你可以选择大小,排序,然后删除重复的内容,这样你就可以使用模式了。在连接的情况下,“模态”值将是数据帧中“第一个”出现的值

gp_cols = ['Location ID']
value_col = 'Company Name'

(df.groupby(gp_cols + [value_col], observed=True, sort=False).size() 
   .to_frame('counts').reset_index() 
   .sort_values('counts', ascending=False) 
   .drop_duplicates(subset=gp_cols)
   .drop(columns='counts'))


#  Location ID Company Name
#0  F55555JONE    jones LLC
#2  F11111ALPH     alpha Co

一些时间安排

import perfplot
import pandas as pd
import numpy as np

def fast_mode(df):
    gp_cols = ['Location ID']
    value_col = 'Company Name'

    return(df.groupby(gp_cols + [value_col], observed=True, sort=False).size() 
              .to_frame('counts').reset_index() 
              .sort_values('counts', ascending=False) 
              .drop_duplicates(subset=gp_cols)
              .drop(columns='counts'))

def apply_value_counts(df):
    return (df.groupby(['Location ID'])['Company Name']
              .apply(lambda x: x.value_counts().index[0]).reset_index())

perfplot.show(
    setup=lambda n: pd.DataFrame({'Location ID': np.random.randint(0, n//50+1, n),
                                  'Company Name': np.random.randint(0, n//500+1, n)}),
    kernels=[
        lambda df: fast_mode(df),
        lambda df: apply_value_counts(df),
    ],
    labels=['Fast Mode', 'Apply Value Counts'],
    n_range=[2 ** k for k in range(2, 24)],
    equality_check = None,  # When tied may differ, also in terms of sorted output
    xlabel='~len(df)'
)

这是以8.08毫秒的速度出现的,比我在我的question@jKrautj
df.groupby([“公司名称”])[“位置ID”]
?groupby“位置ID”?您是否根据公司名称或位置ID分组?就在6.66毫秒,这比我的最佳场景稍微慢一点question@jKraut嗯,我觉得这相当令人惊讶。根据组的数量和每个组中元素的数量,时间会有很大的不同。因此,如果您处于某个极端,比如说每个组只有10个10K行,那么性能可能与每个组有10行的10K组非常不同。根据我的时间安排,对于许多具有中等行数的组,我设置的
fast\u模式应该更快,但可能您处于一个非常不同的场景。如果您可以创建一个大致模拟您拥有的组数、数据帧长度和每个组的行数的示例,可能会有很大帮助。(您可以使用随机种子创建样本数据,就像我在perfplot中所做的那样),这样将更易于优化。