簡體   English   中英

Python pandas數據幀用其他系列填充NaN

[英]Python pandas dataframe fill NaN with other Series

我想基於控制表(fillna_mean)使用列均值和var1作為索引來填充DataFrame(df)列(var4)中的NaN值。在數據幀中,我希望它們在var1上匹配。

我試過用fillna做這個,但我不能讓它一直工作。 如何使用df.var1作為索引匹配fillna_mean.var1以智能方式執行此操作?

DF:

df = pd.DataFrame({'var1' : list('a' * 3) + list('b' * 2) + list('c' * 4) + list('d' * 3)
         ,'var2' : [i for i in range(12)]
         ,'var3' : list(np.random.randint(100, size = 12))
         ,'var4' : [1, 2, np.nan, 3, 2, np.nan, 1, 34, np.nan, np.nan, 12, 12]
     })

fillna_mean:

fillna = pd.DataFrame({'var1' : ['a', 'b', 'c', 'd'],
                       'mean' : [1, 3.5, 6.5, 10]})

最終結果如下:

var1 var2 var3  var4
a    0    69    1.0
a    1    17    2.0
a    2    83    1.0
b    3    12    3.0
b    4    36    2.0
c    5    68    6.5
c    6    13    1.0
c    7    30    34.0
c    8    23    6.5
d    9    82    10.0
d    10   32    12.0
d    11   19    12.0

提前感謝您的投入!

/ swepab

你可以結合.map()方法使用布爾索引

In [178]: fillna.set_index('var1', inplace=True)

In [179]: df.loc[df.var4.isnull(), 'var4'] = df.loc[df.var4.isnull(), 'var1'].map(fillna['mean'])

In [180]: df
Out[180]:
   var1  var2  var3  var4
0     a     0    40   1.0
1     a     1    97   2.0
2     a     2    34   1.0
3     b     3     6   3.0
4     b     4    19   2.0
5     c     5    47   6.5
6     c     6    65   1.0
7     c     7    29  34.0
8     c     8    48   6.5
9     d     9    88  10.0
10    d    10    40  12.0
11    d    11    23  12.0

說明:

In [184]: df.loc[df.var4.isnull()]
Out[184]:
  var1  var2  var3  var4
2    a     2    75   NaN
5    c     5    75   NaN
8    c     8    44   NaN
9    d     9    34   NaN

In [185]: df.loc[df.var4.isnull(), 'var1']
Out[185]:
2    a
5    c
8    c
9    d
Name: var1, dtype: object

In [186]: df.loc[df.var4.isnull(), 'var1'].map(fillna['mean'])
Out[186]:
2     1.0
5     6.5
8     6.5
9    10.0
Name: var1, dtype: float64

更新:從Pandas 0.20.1開始, .ix索引器已棄用,支持更嚴格的.iloc和.loc索引器

with combine_first可以獲得更快的結果,並且您不需要過濾掉非空數據:

fillna.set_index('var1', inplace=True)

df.var4 = df.var4.combine_first(df.var1.map(fillna['mean']))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM