Pandas 熊猫是一种可供选择的性能?
试图在这个GroupBy上提高速度,并提出用更快的代码替换它的想法 目标是创建一个“规范化名称”列,这是基于“位置ID”最频繁出现的列。如何以更有效的方式实现相同的结果 这是我的入门数据框架: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
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中所做的那样),这样将更易于优化。