我一直在寻找SO的最佳方式来应用一个函数,该函数采用多个单独的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个NEW列。但是,这可以推广到一个用例/函数,该用例/函数接受n
DataFrame列并将m
新列输出到同一DataFrame。
以下是我一直在关注的事情(取得不同程度的成功):
transform_func
,以明确预期行(即字段)A
,B
,C
如下所示,然后做一个适用于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
我希望以一种非常通用的Python方式来完成此任务,同时兼顾性能(包括内存和时间)。我对此表示感谢,因为由于对熊猫不熟悉,我一直在为此苦苦挣扎。
通过以下方式编写您的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'])
要仅获取新值,请将此函数应用于每一行:
df.apply(transform_func, axis=1)
请注意,生成的DataFrame保留了原始行的键(我们稍后将使用此功能)。
或者,如果要将这些新列添加到DataFrame中,请将df与上述应用程序的结果连接起来,然后将连接结果保存在原始df下:
df = df.join(df.apply(transform_func, axis=1))
使用zip可能是最慢的选择。基于行的功能应该更快,并且结构更直观。最快的方法可能是为每列分别编写2个向量化表达式。在这种情况下,类似:
df['new_A'] = df.A + df.B
df['new_B'] = df.C + '_xx'
但是通常的问题是基于行的函数是否可以表示为矢量化表达式(如上所述)。在“负”情况下,您可以应用基于行的函数。
要比较每个解决方案的速度,请使用%timeit。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句