python - 应用函数不会替换数据框中的值

标签 python pandas

我正在尝试根据一些相应组的中位数替换年龄的 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 值就不会被替换。我很感激任何帮助。谢谢!

编辑:正如纳撒尼尔所说,这段代码运行良好。事实上 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'] 部分。

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

最佳答案

您必须对函数进行格式化以获取一个系列并返回一个系列,而不是仅对系列中的一个元素进行操作。我在下面添加了函数 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,所以我无法复制您的问题。通过我准备的一些测试数据,我不仅能够使其正常工作,而且还能够使您的正常工作。

关于python - 应用函数不会替换数据框中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44959260/

相关文章:

python - 如何在浏览器最小化时使用 selenium webdriver 执行测试

python - Selenium Firefox 驱动程序引发异常 OSError : [Errno 8] Exec format error

python - PyQt设计器: How to make a button's edges rounder?

python - 安装 PyGtk 时出错

python - 数据帧值范围内的重复行

Python:构建 Pandas 数据帧对象

python - Python 的 NoSQL 抽象层

python-3.x - 将 .sav 文件转换为 Pandas 数据框

python - 如何为 pandas 数据框中的切片赋值

python - 如何使用 iloc[:, 0] 将第一列设置为索引