当前位置:首页 > 科技  > 软件

让你的Pandas代码快得离谱的两个技巧

来源: 责编: 时间:2024-01-19 09:20:20 341观看
导读如果你曾经使用过Pandas处理表格数据,你可能会熟悉导入数据、清洗和转换的过程,然后将其用作模型的输入。然而,当你需要扩展和将代码投入生产时,你的Pandas管道很可能开始崩溃并运行缓慢。在这篇文章中,笔者将分享2个技巧,

如果你曾经使用过Pandas处理表格数据,你可能会熟悉导入数据、清洗和转换的过程,然后将其用作模型的输入。然而,当你需要扩展和将代码投入生产时,你的Pandas管道很可能开始崩溃并运行缓慢。在这篇文章中,笔者将分享2个技巧,帮助你让Pandas代码快得离谱,提升数据处理效率并避免常见的陷阱。Z0228资讯网——每日最新资讯28at.com

Z0228资讯网——每日最新资讯28at.com

技巧1:矢量化操作

在Pandas中,矢量化操作是一种强大的工具,它可以用一种更简洁和高效的方式处理整个数据框的列,而不是逐行循环。Z0228资讯网——每日最新资讯28at.com

它是如何工作的?

广播是矢量化操作的一个关键要素,它允许您直观地操作具有不同形状的对象。Z0228资讯网——每日最新资讯28at.com

eg1: 具有3个元素的数组a与标量b相乘,得到与Source形状相同的数组。Z0228资讯网——每日最新资讯28at.com

Z0228资讯网——每日最新资讯28at.com

eg2: 在进行加法运算时,将形状为(4,1)的数组a与形状为(3,)的数组b相加,结果会得到一个形状为(4,3)的数组。Z0228资讯网——每日最新资讯28at.com

Z0228资讯网——每日最新资讯28at.com

关于这一点已经有很多文章,并且在深度学习中,大规模的矩阵乘法是非常常见的。在本文中,我们将利用两个简短的例子上进行讨论。Z0228资讯网——每日最新资讯28at.com

首先,假设您想要计算给定整数在列中出现的次数。以下是 2 种可能的方法。Z0228资讯网——每日最新资讯28at.com

"""计算DataFrame X 中 "column_1" 列中等于目标值 target 的元素个数。参数:X: DataFrame,包含要计算的列 "column_1"。target: int,目标值。返回值:int,等于目标值 target 的元素个数。"""# 使用循环计数def count_loop(X, target: int) -> int:    return sum(x == target for x in X["column_1"])# 使用矢量化操作计数def count_vectorized(X, target: int) -> int:    return (X["column_1"] == target).sum()

现在假设有一个DataFrame带有日期列并希望将其偏移给定的天数。使用矢量化操作计算如下:Z0228资讯网——每日最新资讯28at.com

def offset_loop(X, days: int) -> pd.DataFrame:        d = pd.Timedelta(days=days)    X["column_const"] = [x + d for x in X["column_10"]]    return Xdef offset_vectorized(X, days: int) -> pd.DataFrame:    X["column_const"] = X["column_10"] + pd.Timedelta(days=days)    return X

技巧2:迭代

「for循环」

第一个也是最直观的迭代方法是使用Python for循环。Z0228资讯网——每日最新资讯28at.com

def loop(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    res = []    i_remove_col = df.columns.get_loc(remove_col)    i_words_to_remove_col = df.columns.get_loc(words_to_remove_col)    for i_row in range(df.shape[0]):        res.append(            remove_words(                df.iat[i_row, i_remove_col], df.iat[i_row, i_words_to_remove_col]            )        )    return result

「apply」

def apply(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    return df.apply(        func=lambda x: remove_words(x[remove_col], x[words_to_remove_col]), axis=1    ).tolist()

在 df.apply 的每次迭代中,提供的可调用函数获取一个 Series,其索引为 df.columns,其值是行的。这意味着 pandas 必须在每个循环中生成该序列,这是昂贵的。为了降低成本,最好对您知道将使用的 df 子集调用 apply,如下所示:Z0228资讯网——每日最新资讯28at.com

def apply_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    return df[[remove_col, words_to_remove_col]].apply(        func=lambda x: remove_words(x[remove_col], x[words_to_remove_col]), axis=1    )

「列表组合+itertuples」

使用itertuples与列表相结合进行迭代肯定会更好。itertuples生成带有行数据的(命名)元组。Z0228资讯网——每日最新资讯28at.com

def itertuples_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    return [        remove_words(x[0], x[1])        for x in df[[remove_col, words_to_remove_col]].itertuples(            index=False, name=None        )    ]

「列表组合+zip」

zip接受可迭代对象并生成元组,其中第i个元组按顺序包含所有给定可迭代对象的第i个元素。Z0228资讯网——每日最新资讯28at.com

def zip_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    return [remove_words(x, y) for x, y in zip(df[remove_col], df[words_to_remove_col])]

「列表组合+to_dict」

def to_dict_only_used_columns(df: pd.DataFrame) -> list[str]:        return [            remove_words(row[remove_col], row[words_to_remove_col])            for row in df[[remove_col, words_to_remove_col]].to_dict(orient="records")        ]

「缓存」

除了我们讨论的迭代技术之外,另外两种方法可以帮助提高代码的性能:缓存和并行化。如果使用相同的参数多次调用 pandas 函数,缓存会特别有用。例如,如果remove_words应用于具有许多重复值的数据集,您可以使用它functools.lru_cache来存储函数的结果并避免每次都重新计算它们。要使用lru_cache,只需将@lru_cache装饰器添加到 的声明中remove_words,然后使用您首选的迭代方法将该函数应用于您的数据集。这可以显着提高代码的速度和效率。以下面的代码为例:Z0228资讯网——每日最新资讯28at.com

@lru_cachedef remove_words(...):    ... # Same implementation as beforedef zip_only_used_cols_cached(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    return [remove_words(x, y) for x, y in zip(df[remove_col], df[words_to_remove_col])]

添加此装饰器会生成一个函数,该函数会“记住”之前遇到的输入的输出,从而无需再次运行所有代码。Z0228资讯网——每日最新资讯28at.com

「并行化」

最后一张王牌是使用 pandarallel 跨多个独立的 df 块并行化我们的函数调用。该工具易于使用:您只需导入并初始化它,然后将所有 .applys 更改为 .parallel_applys。Z0228资讯网——每日最新资讯28at.com

from pandarallel import pandarallelpandarallel.initialize(nb_workers=min(os.cpu_count(), 12))def parapply_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:    return df[[remove_col, words_to_remove_col]].parallel_apply(        lambda x: remove_words(x[remove_col], x[words_to_remove_col]), axis=1    )

本文链接:http://www.28at.com/showinfo-26-64975-0.html让你的Pandas代码快得离谱的两个技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 2024年不容错过的十大开发框架

下一篇: 12 月网约车行业共收到 8.94 亿单环比上升 8.3%,如祺出行蝉联订单合规率榜首

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
Top