使用NaN获得大熊猫系列模式的最快方法

艾琳

我需要找到pandas groupby对象或单个系列的模式/最常见元素,为此,我具有以下功能:

def get_most_common(srs):
    from collections import Counter
    import numpy as np

    x = list(srs)
    my_counter = Counter(x)
    if np.nan not in my_counter.keys():
        most_common_value = my_counter.most_common(1)[0][0]
    else:
        most_common_value = srs.mode(dropna=False).iloc[0]

    return most_common_value

如果是平局,我不在乎选择哪一个-随机是可以的。

Counter如果没有NaN,则速度会更快,但使用NaN会给出错误的结果。pd.Series.mode总是正确的,但是比Counter没有NaN时要慢这是一场赌博(由于没有额外的检查,在没有NaN时速度更快,而在没有NaN时速度更快np.nan not in my_counter.keys())。到目前为止,我的大型数据集获得了令人满意的性能,这可能是因为在许多情况下都没有NaN。但是有没有办法使它更快呢?

抽烟

我发现使用会获得更好的性能,这很奇怪Counter这是我的测试结果(n=10000):

Using Series.mode on Series with nan: 52.41649858
Using Series.mode on Series without nan: 17.186453438
Using Counter on Series with nan: 269.33117825500005
Using Counter on Series without nan: 134.207576572

#-----------------------------------------------------#

             Series.mode  Counter
             -----------  -------------
With nan     52.42s       269.33s
Without nan  17.19s       134.21s

测试代码:

import timeit

setup = '''
import pandas as pd
from collections import Counter

def get_most_common(srs):
    return srs.mode(dropna=False)[0]

def get_most_common_counter(srs):
    x = list(srs)
    my_counter = Counter(x)
    return my_counter.most_common(1)[0][0]

df = pd.read_csv(r'large.data')
'''

print(f"""Using Series.mode on Series with nan: {timeit.timeit('get_most_common(df["has_nan"])', setup=setup, number=10000)}""")
print(f"""Using Series.mode on Series without nan: {timeit.timeit('get_most_common(df["no_nan"])', setup=setup, number=10000)}""")
print(f"""Using Counter on Series with nan: {timeit.timeit('get_most_common_counter(df["has_nan"])', setup=setup, number=10000)}""")
print(f"""Using Counter on Series without nan: {timeit.timeit('get_most_common_counter(df["no_nan"])', setup=setup, number=10000)}""")

large.dataDataFrame0的2 x 50000行随机2位数字符串99,其中has_nan具有modenan=551


如果有的话,您的if np.nan not in my_counter.keys()条件将始终被触发,因为np.nan 不在中my_counter.keys()因此,实际上您从未使用过pd.Series.mode,它一直在使用Counter正如在其他问题中提到的,因为你的pandas对象已经创建的副本np.nanSeries/DataFrame,该in条件将永远不会实现。试试看:

np.nan in pd.Series([np.nan, 1, 2]).to_list()
# False

消除整个过程的复杂性,if/else并坚持使用一种方法。然后比较性能。正如您在其他问题中提到的那样,与任何外部模块/方法相比,大熊猫方法几乎总是更好的方法。如果您仍在观察,请更新您的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得大熊猫系列中下一个非NaN编号的索引?

来自分类Dev

大熊猫相交系列

来自分类Dev

大熊猫联产NaN

来自分类Dev

大熊猫联产NaN

来自分类Dev

获得大熊猫的骨料

来自分类Dev

在大熊猫中使用groupby以获得比例的更有效方法

来自分类Dev

如何获得滚动大熊猫系列和固定系列的相关性?

来自分类Dev

大熊猫的申请方法

来自分类Dev

比较大熊猫系列是否包含nan时是否相等?

来自分类Dev

使用大熊猫适用

来自分类Dev

如何获得大熊猫假的计数

来自分类Dev

str。包含大熊猫的特定模式

来自分类Dev

比较大熊猫中日期时间的最快方法是什么?

来自分类Dev

将大熊猫DataFrame保存到S3的最快方法是什么?

来自分类Dev

大熊猫使用Apply方法并发送列名?

来自分类Dev

存在NaN时,将INT转换为Float的大熊猫有什么解决方法?

来自分类Dev

使用大熊猫的柱子视图吗?

来自分类Dev

使用大熊猫插补

来自分类Dev

按索引对大熊猫系列进行排序

来自分类Dev

大熊猫:将CSV系列转换为数据框

来自分类Dev

通过重命名合并大熊猫分类系列

来自分类Dev

大熊猫系列中的向量化日期解析?

来自分类Dev

大熊猫:将CSV系列转换为数据框

来自分类Dev

通过重命名合并大熊猫分类系列

来自分类Dev

如何用NAN值分割大熊猫时间序列

来自分类Dev

在大熊猫值过滤数据框保留为NaN

来自分类Dev

计算大熊猫DataFrame中带有NaN的行数?

来自分类Dev

大熊猫获得每个类别的最高3分

来自分类Dev

大熊猫从列表列中获得唯一值