pandas中apply报错`incompatible index of inserted column with frame index`的解决办法

bmy-share / 2024-10-17 / 原文

源代码

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通常用于执行能够广播到整个列或行的操作,如标准化、归一化或任何保持原始索引结构的数学变换。
  • transformapply更高效,因为它设计用于保持索引结构,不需要进行额外的索引对齐操作。

比较applytransform

以下是一些比较applytransform的关键点:

  • 索引保持transform保证返回相同形状的对象,而apply可能不保证。
  • 灵活性apply更加灵活,可以执行更复杂的操作,而transform则限制在能够广播的操作上。
  • 性能:当处理大型数据集时,transform通常比apply更高效,因为它不需要处理索引对齐问题。

选择哪个方法?

  • 如果需要对DataFrame或Series进行复杂的自定义操作,并且返回的对象可能与原始对象形状不同,那么应该使用apply
  • 如果需要进行简单的数学运算或数据转换,并且需要保证返回的对象与原始对象形状相同,那么应该使用transform

在实际使用中,选择哪个方法取决于的具体需求和场景。