通过两级索引系列填充NA值

时间:2017-05-05 05:12:31

标签: python pandas dataframe

我有一个包含列(ABvalue)的数据框,其中value列中缺少值。并且有一个系列由数据框中的两列(AB)索引。如何使用系列中的相应值填充数据框中的缺失值?

2 个答案:

答案 0 :(得分:2)

我认为fillnaset_index需要reset_index

df = pd.DataFrame({'A': [1,1,3],
                   'B': [2,3,4],
                   'value':[2,np.nan,np.nan] })

print (df)
   A  B  value
0  1  2    2.0
1  1  3    NaN
2  3  4    NaN

idx = pd.MultiIndex.from_product([[1,3],[2,3,4]])
s = pd.Series([5,6,0,8,9,7], index=idx)
print (s)
1  2    5
   3    6
   4    0
3  2    8
   3    9
   4    7
dtype: int64

df = df.set_index(['A','B'])['value'].fillna(s).reset_index()
print (df)
   A  B  value
0  1  2    2.0
1  1  3    6.0
2  3  4    7.0

答案 1 :(得分:2)

考虑数据框和系列dfs

df = pd.DataFrame(dict(
        A=list('aaabbbccc'),
        B=list('xyzxyzxyz'),
        value=[1, 2, np.nan, 4, 5, np.nan, 7, 8, 9]
    ))

s = pd.Series(range(1, 10)[::-1])
s.index = [df.A, df.B]

我们可以fillna使用聪明的join

df.fillna(df.join(s.rename('value'), on=['A', 'B'], lsuffix='_'))
#                   \_____________/                 \_________/ 
#                   make series same                  get old
#                    name as column                  column out
#                    we are filling                  of the way

   A  B  value
0  a  x    1.0
1  a  y    2.0
2  a  z    7.0
3  b  x    4.0
4  b  y    5.0
5  b  z    4.0
6  c  x    7.0
7  c  y    8.0
8  c  z    9.0

<强> 时序
join很可爱,但@ jezrael set_index更快

%timeit df.fillna(df.join(s.rename('value'), on=['A', 'B'], lsuffix='_'))
100 loops, best of 3: 3.56 ms per loop

%timeit df.set_index(['A','B'])['value'].fillna(s).reset_index()
100 loops, best of 3: 2.06 ms per loop