用pandas中另一列的值替换一列中的nan:我的代码出了什么问题

时间:2018-02-27 22:49:58

标签: python pandas

我有一个如下的数据框。我需要将a列中的nan替换为同一行中b列的相应值。

df = pd.DataFrame({'a': [1,2,3,4,np.nan, np.nan, 5],
                   'b': [4,5,6,7,8,9,1]})
df['a'] =df.apply(lambda row: row['b'] if row['a'].isnull() else row['a'] )

我收到了错误:

KeyError: ('a', 'occurred at index a')

我在代码中做错了什么?在想了很久之后,我无法理解它为什么不起作用。任何人都可以帮我这个吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

您需要使用axis=1,还必须使用pd.isnull(row['a'])

In [6]: df.apply(lambda row: row['b'] if pd.isnull(row['a']) else row['a'], axis=1)
Out[6]:
0    1.0
1    2.0
2    3.0
3    4.0
4    8.0
5    9.0
6    5.0
dtype: float64

虽然您不应该首先使用.apply,但请使用fillna

In [9]: df.a.fillna(df.b)
Out[9]:
0    1.0
1    2.0
2    3.0
3    4.0
4    8.0
5    9.0
6    5.0
Name: a, dtype: float64

更一般地说,对于任何谓词,请使用pd.Series.where

In [32]: df.a.where(pd.notnull, df.b)
Out[32]:
0    1.0
1    2.0
2    3.0
3    4.0
4    8.0
5    9.0
6    5.0
Name: a, dtype: float64

答案 1 :(得分:1)

您必须传递index = 1才能对行进行操作。这段代码适用于我:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1,2,3,4,np.nan, np.nan, 5],
                   'b': [4,5,6,7,8,9,1]})

df['a'] =df.apply(lambda row: row['b'] if pd.isnull(row['a']) else row['a'], axis=1)

df