源代码
import pandas as pd
df = pd.read_csv("Titanic.csv")
# 对Sex分组,用各组乘客的平均年龄填充各组中的缺失年龄
df_cleaned['Age'] = df_cleaned.groupby('Sex')['Age'].apply(lambda x: x.fillna(x.mean()))
报错信息
incompatible index of inserted column with frame index
问题原因
在Pandas DataFrame中设置一个新列时,新列的索引与DataFrame的索引不匹配导致的
解决办法
df_cleaned['Age'] = df_cleaned.groupby('Sex')['Age'].apply(lambda x: x.fillna(x.mean()))
拓展:
apply方法
apply
方法用于将一个函数应用到DataFrame或Series的每一行或每一列上。它非常灵活,几乎可以执行任何自定义操作。
用法示例:
- 对DataFrame的每一列应用一个函数:
df.apply(lambda x: some_function(x))
- 对DataFrame的每一行应用一个函数:
df.apply(lambda x: some_function(x), axis=1)
特点:
apply
可以返回标量值、Series或DataFrame,这取决于传入的函数。apply
不保证返回的对象与原始对象具有相同的索引结构。apply
的灵活性使其成为执行复杂自定义操作的常用方法。
transform方法
transform
方法用于对DataFrame或Series中的每个元素应用一个函数,但它有一些限制,即返回的对象必须与原始对象具有相同的形状。
用法示例:
- 对DataFrame的每一列应用一个函数,并保持索引不变:
df.transform(lambda x: some_function(x))
特点:
transform
返回的对象必须与原始对象具有相同的形状。例如,如果对DataFrame的列应用transform
,则返回的必须是具有相同索引和列数的DataFrame。transform
通常用于执行能够广播到整个列或行的操作,如标准化、归一化或任何保持原始索引结构的数学变换。transform
比apply
更高效,因为它设计用于保持索引结构,不需要进行额外的索引对齐操作。
比较apply
和transform
以下是一些比较apply
和transform
的关键点:
- 索引保持:
transform
保证返回相同形状的对象,而apply
可能不保证。 - 灵活性:
apply
更加灵活,可以执行更复杂的操作,而transform
则限制在能够广播的操作上。 - 性能:当处理大型数据集时,
transform
通常比apply
更高效,因为它不需要处理索引对齐问题。
选择哪个方法?
- 如果你需要对DataFrame或Series进行复杂的自定义操作,并且返回的对象可能与原始对象形状不同,那么应该使用
apply
。 - 如果你需要进行简单的数学运算或数据转换,并且需要保证返回的对象与原始对象形状相同,那么应该使用
transform
。
在实际使用中,选择哪个方法取决于你的具体需求和场景。