【问题标题】:Apply function doesn't replace values in dataframe应用函数不会替换数据框中的值
【发布时间】:2017-07-07 09:46:25
【问题描述】:

我正在尝试根据一些相应组的中位数替换年龄的 nan 值。我使用 groupby 制作了一个名为 grouped_median 的表。这是我的代码:

def fillAges(row, grouped_median):
    return grouped_median.loc[row['Sex'], row['Class'], row['Title']]['Age'] 


df['Age'] = df.apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1)

df

如果我只打印这部分:

print(df.apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1))

这些值是正确的,但是一旦我查看 df,nan 值就不会被替换。我很感激任何帮助。谢谢!

编辑:正如 Nathaniel 所说,这段代码运行良好。实际上,df 是一个大数据框,它由训练数据集和测试数据集连接而成,并带有一个额外的标志列,即“训练”或“测试”。然后这就是我正在做的:

df[df['flag']=='train']['Age'] = df[df['flag']=='train'].apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1)

它不会工作。这会给我这个警告,但我认为这只是一个警告,并不意味着它实际上没有做任何事情!!! “试图在 DataFrame 的切片副本上设置值。尝试使用 .loc[row_indexer,col_indexer] = value 代替请参阅文档中的警告:pandas.pydata.org/pandas-docs/stable/...

我需要做的就是从左侧删除 [df['flag']=='train'] 部分。

我仍然不确定为什么这种方法不起作用。如果有人有见识,我很感激知道。谢谢

【问题讨论】:

  • 查看这篇关于使用fillna() 进行插补(即用中值填充缺失数据)的帖子:stackoverflow.com/questions/32617811/…
  • 谢谢!但这对我不起作用。我想使用特定组的中位数。我已经制作了我的桌子,我使用了 apply 功能。中位数实际上不是我的问题。我的问题是为什么没有在数据框中替换数据。

标签: python pandas


【解决方案1】:

您必须对函数进行格式化以获取系列并返回系列,而不是仅对系列中的一个元素进行操作。我在下面添加了函数series_op,它应该会为你做这件事。

def fillAges(row, grouped_median):
    return grouped_median.loc[row['Sex'], row['Class'], row['Title']]['Age'] 

def series_op(x):
    x['Age'] = fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age']
    return x


corrected_df = df.apply(series_op, axis=1)

我没有你的数据,也没有grouped_median,所以我无法复制你的问题。借助我编写的一些测试数据,我可以让它正常工作,但也能让你的数据正常工作。

【讨论】:

  • 不正确。 apply() 肯定会返回值。
  • 非常感谢纳撒尼尔!效果很好。对不起,但我不明白为什么我的方法是错误的。我的代码将采用一系列所需的元素并返回这些元素,我希望将它们分配给我的 df。我正在尝试学习;为什么它不工作?我不应该将系列的一部分传递给#apply 函数吗?
  • 我很高兴它对你有用。请接受我的回答。 ---我不确定为什么你的方式不适合你。我必须查看您使用的数据才能弄清楚。使用我的玩具数据,我的方法和你的方法都可以正常工作。
  • 绝对。我想出了我做错了什么,并在我的帖子末尾将其添加为编辑,但仍然不确定为什么它不起作用。我正在做的事情给了我这个警告,但我认为这只是一个警告,并不意味着它实际上没有做任何事情!!! “试图在 DataFrame 中的切片副本上设置值。尝试使用 .loc[row_indexer,col_indexer] = value 请参阅文档中的警告:pandas.pydata.org/pandas-docs/stable/…
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2018-01-02
  • 2020-02-26
  • 2017-03-23
  • 1970-01-01
  • 2021-12-10
  • 2021-03-23
相关资源
最近更新 更多