gpt4 book ai didi

python - Pandas DataFrame 将函数应用于多列并输出多列

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:42 25 4
gpt4 key购买 nike

我一直在寻找应用函数的最佳方法,该函数采用多个单独的 Pandas DataFrame 列并在同一个所述 DataFrame 中输出多个新列。假设我有以下内容:

def apply_func_to_df(df):
df[['new_A', 'new_B']] = df.apply(lambda x: transform_func(x['A'], x['B'], x['C']), axis=1)

def transform_func(value_A, value_B, value_C):
# do some processing and transformation and stuff
return new_value_A, new_value_B

我正在尝试将如上所示的此函数应用于整个 DataFrame df 以输出 2 个新列。但是,这可以推广到一个用例/函数,它接受 n DataFrame 列并将 m 新列输出到同一 DataFrame。

以下是我一直在关注的事情(取得了不同程度的成功):

  • 为函数调用创建一个 Pandas Series,然后附加到现有的 DataFrame,
  • 压缩输出列(但在我当前的实现中出现了一些问题)
  • 重写基本函数 transform_func 以明确期望行(即字段)ABC 如下所示,然后对 df 进行应用:

def transform_func_mod(df_row):
# do something with df_row['A'], df_row['B'], df_row['C]
return new_value_A, new_value_B

我想要一种非常通用和 Pythonic 的方式来完成这个任务,同时考虑性能(内存和时间方面)。我将不胜感激,因为我对 Pandas 不熟悉,因此一直在努力解决这个问题。

最佳答案

按以下方式编写您的transform_func:

  • 它应该有一个参数——当前行,
  • 这个函数可以从当前行读取单独的列并充分利用它们,
  • 返回的对象应该是一个系列,其中:
    • 值(value)观——无论你想返回什么,
    • index - 目标列名称。

示例:假设所有 3 列都是 string 类型,连接 AB 列,将“some string”添加到 C:

def transform_func(row):
a = row.A; b = row.B; c = row.C;
return pd.Series([ a + b, c + '_xx'], index=['new_A', 'new_B'])

获取新值,请将此函数应用于每一行:

df.apply(transform_func, axis=1)

请注意,生成的 DataFrame 保留了原始行的键(稍后我们将使用此功能)。

或者,如果您想将这些新列添加到您的 DataFrame,请加入您的df上面应用的结果,将连接结果保存在原始的df:

df = df.join(df.apply(transform_func, axis=1))

根据 03:36:34Z 的评论进行编辑

使用 zip 可能是最慢的选择。基于行的功能应该更快,并且是更直观的构造。可能最快的方法是分别为每一列编写 2 个矢量化表达式。在这种情况下是这样的:

df['new_A'] = df.A + df.B
df['new_B'] = df.C + '_xx'

但一般的问题是是否基于行的函数可以表示为矢量化表达式(就像我上面做的那样)。在“负”情况下,您可以应用基于行的函数。

要比较每个解决方案的速度,请使用 %timeit

关于python - Pandas DataFrame 将函数应用于多列并输出多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58798381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com