如何在 pandas 中将函数应用于列创建新列?不同方法比较
2024-03-17 19:17:03
在数据分析中,我们经常需要对数据进行转换和操作。其中一个常见的任务是将函数应用于 pandas DataFrame 的列,以创建多个新列。本指南将讨论在 pandas 中实现此目标的不同方法,并比较它们的性能和适用性。
方法
方法 1:使用 df.assign()
df.assign()
方法是将新列添加到 DataFrame 的一种简洁且高效的方法。它接受一个函数作为参数,该函数将应用于 DataFrame 的每一行,并返回一个或多个新列。
import pandas as pd
# 示例 DataFrame
df = pd.DataFrame({'textcol': ['example text', 'another example']})
# 定义提取文本特征的函数
def extract_text_features(text):
return {'col1': len(text), 'col2': text.upper(), 'col3': text.count('e')}
# 使用 df.assign() 添加新列
df = df.assign(**extract_text_features(df['textcol']))
print(df)
方法 2:使用 df.apply()
df.apply()
方法可以将一个函数应用于 DataFrame 的每一行或列。它返回一个包含应用函数的结果的新 DataFrame。
# 使用 df.apply() 添加新列
df[['col1', 'col2', 'col3']] = df['textcol'].apply(lambda x: pd.Series(extract_text_features(x)))
print(df)
方法 3:使用 df.iterrows()
df.iterrows()
方法是一个生成器,可以迭代 DataFrame 中的每一行。它返回一个元组,其中包含行索引和该行的 Series。
# 使用 df.iterrows() 添加新列
for i, row in df.iterrows():
cols = extract_text_features(row['textcol'])
df.loc[i, 'col1'] = cols[0]
df.loc[i, 'col2'] = cols[1]
df.loc[i, 'col3'] = cols[2]
print(df)
性能比较
这三种方法的性能可能会因 DataFrame 的大小和函数的复杂性而异。一般来说,df.assign()
是最快的,其次是 df.apply()
,最后是 df.iterrows()
。以下是一个简单的性能测试:
import timeit
# 创建一个较大的 DataFrame 用于性能测试
large_df = pd.DataFrame({'textcol': ['example text'] * 10000})
# 测量 df.assign() 的性能
time_assign = timeit.timeit(lambda: large_df.assign(**extract_text_features(large_df['textcol'])), number=10)
# 测量 df.apply() 的性能
time_apply = timeit.timeit(lambda: large_df['textcol'].apply(lambda x: pd.Series(extract_text_features(x))), number=10)
# 测量 df.iterrows() 的性能
time_iterrows = timeit.timeit(lambda: [extract_text_features(row['textcol']) for i, row in large_df.iterrows()], number=10)
print(f"df.assign() 时间: {time_assign:.4f} 秒")
print(f"df.apply() 时间: {time_apply:.4f} 秒")
print(f"df.iterrows() 时间: {time_iterrows:.4f} 秒")
结论
在 pandas 中应用函数以创建多个新列有多种方法。选择最合适的方法取决于 DataFrame 的大小、函数的复杂性以及所需的性能水平。一般来说,df.assign()
是最简洁和高效的选择,但在某些情况下,df.apply()
可能更灵活。df.iterrows()
通常较慢,但在处理非常复杂的逻辑时可能是必要的。
常见问题解答
问:什么时候应该使用 df.assign()
?
答:当需要将新列添加到 DataFrame 时,df.assign()
是一个简洁高效的选择。
问:df.apply()
和 df.iterrows()
有什么区别?
答:df.apply()
将函数应用于整个行或列,而 df.iterrows()
迭代 DataFrame 的每一行。
问:为什么 df.iterrows()
通常比其他方法慢?
答:df.iterrows()
的速度慢,因为它是逐行地进行操作,而其他方法则采用向量化的方法。
问:除了讨论的方法之外,还有其他方法可以将函数应用于列吗?
答:还可以使用循环或列表解析,但这些方法通常比讨论的方法效率较低。
问:如何优化 extract_text_features
函数以提高性能?
答:通过避免不必要的计算、利用向量化和缓存中间结果,可以优化函数以提高性能。