Apply函数不会替换dataframe中的值

时间:2017-07-06 21:35:46

标签: python pandas

我正在尝试根据一些相应群体的中位数来替换年龄的纳米值。我使用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']部分。

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

1 个答案:

答案 0 :(得分:2)

你必须格式化函数以获取一系列并返回一个系列,而不是只对该系列的一个元素进行操作。我已经添加了下面的函数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所以我无法复制您的问题。通过我已经制作的一些测试数据,我能够正常工作,但也能让你的工作正常。