qxz*_*ver 9 python apply dataframe pandas
我一直在寻找应用函数的最佳方法,该函数采用多个单独的 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
Run Code Online (Sandbox Code Playgroud)
我正在尝试将此函数如上所示应用于整个 DataFrame df,以便输出 2 个新列。但是,这可以推广到接受nDataFrame 列并将m新列输出到同一 DataFrame 的用例/函数。
以下是我一直在关注的事情(取得了不同程度的成功):
transform_func以显式期望行(即字段)A, B,C如下所示,然后对 df 进行 apply: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
Run Code Online (Sandbox Code Playgroud)
我想要一种非常通用和 Pythonic 的方法来完成这项任务,同时考虑性能(内存和时间方面)。我将不胜感激对此的任何意见,因为由于我对 Pandas 不熟悉,我一直在努力解决这个问题。
按以下方式编写你的transform_func :
示例:假设所有 3 列都是字符串类型,连接A和B列,将“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'])
Run Code Online (Sandbox Code Playgroud)
要仅获取新值,请将此函数应用于每一行:
df.apply(transform_func, axis=1)
Run Code Online (Sandbox Code Playgroud)
请注意,生成的 DataFrame 保留了原始行的键(稍后我们将使用此功能)。
或者,如果您想将这些新列添加到 DataFrame 中,请将df 与上述应用程序的结果连接起来,并将连接结果保存在原始df下:
df = df.join(df.apply(transform_func, axis=1))
Run Code Online (Sandbox Code Playgroud)
使用zip可能是最慢的选择。基于行的函数应该更快,并且是更直观的构造。也许最快的方法是为每一列分别编写 2 个向量化表达式。在这种情况下,类似:
df['new_A'] = df.A + df.B
df['new_B'] = df.C + '_xx'
Run Code Online (Sandbox Code Playgroud)
但通常问题是基于行的函数是否可以表示为向量化表达式(就像我上面所做的那样)。在“否定”情况下,您可以应用基于行的函数。
要比较每个解决方案的速度,请使用%timeit。