用熊猫数据框中另一列的值在多列中填充Na

时间:2019-08-01 07:02:11

标签: python python-3.x pandas fillna

Pandas版本0.23.4,python版本3.7.1
我有一个如下所示的数据框df

df = pd.DataFrame([[0.1, 2, 55, 0,np.nan],
                   [0.2, 4, np.nan, 1,99],
                   [0.3, np.nan, 22, 5,88],
                   [0.4, np.nan, np.nan, 4,77]],
                   columns=list('ABCDE'))
     A    B     C  D     E
0  0.1  2.0  55.0  0   NaN
1  0.2  4.0   NaN  1  99.0
2  0.3  NaN  22.0  5  88.0
3  0.4  NaN   NaN  4  77.0

我想用列“ A”中的值替换列BC中的Na值。

预期输出为

     A   B      C    D      E 
0   0.1  2.0    55.0   0    NaN 
1   0.2  4.0    0.2    1    99.0 
2   0.3  0.3    22.0   5    88.0 
3   0.4  0.4    0.4    4    77.0

我尝试将fillaxis 0一起使用fillna,但没有给出预期的输出(其填充来自上一列)

df.fillna(method='ffill',axis=0, inplace = True)
    A    B     C   D     E
0  0.1  2.0  55.0  0   NaN
1  0.2  4.0  55.0  1  99.0
2  0.3  4.0  22.0  5  88.0
3  0.4  4.0  22.0  4  77.0  

df.fillna(method='ffill',axis=1, inplace = True)
  

输出:NotImplementedError:

也尝试过

df[['B','C']] = df[['B','C']].fillna(df.A)
output:
    A    B     C   D     E
0  0.1  2.0  55.0  0   NaN
1  0.2  4.0   NaN  1  99.0
2  0.3  NaN  22.0  5  88.0
3  0.4  NaN   NaN  4  77.0

尝试使用BC0填充inplacedf[['B','C']].fillna(0,inplace=True) output: A B C D E 0 0.1 2.0 55.0 0 NaN 1 0.2 4.0 NaN 1 99.0 2 0.3 NaN 22.0 5 88.0 3 0.4 NaN NaN 4 77.0 中的所有Na,但这也没有得到预期的输出

0

如果将df[['B','C']] = df[['B','C']].fillna(0) output: A B C D E 0 0.1 2.0 55.0 0 NaN 1 0.2 4.0 0.0 1 99.0 2 0.3 0.0 22.0 5 88.0 3 0.4 0.0 0.0 4 77.0 填充到数据帧的一部分,则可以将其分配回同一子集。

B

1)如何使用给定数据帧中的列C中的值来填充列Affill中的na值?
2)同样,在数据框的子集上使用fillna时,为什么嵌线不起作用。
3)如何沿着行const obj = { a: 1, b: 2, c: 3, d: 4 }; const values =extractValues(obj, ['a', 'd']); function extractValues(obj,arr) { return arr.map(function(e){return obj[e]}) } console.log(values)(已实现)?

1 个答案:

答案 0 :(得分:4)

  

1)如何使用给定数据帧中A列的值填充BandC列中的na值?

由于未实现按列替换,可能的解决方案是两次转置:

df[['B','C']] = df[['B','C']].T.fillna(df['A']).T
print (df)
     A    B     C  D     E
0  0.1  2.0  55.0  0   NaN
1  0.2  4.0   0.2  1  99.0
2  0.3  0.3  22.0  5  88.0
3  0.4  0.4   0.4  4  77.0

或者:

m = df[['B','C']].isna()
df[['B','C']] = df[['B','C']].mask(m, m.astype(int).mul(df['A'], axis=0))
print (df)
     A    B     C  D     E
0  0.1  2.0  55.0  0   NaN
1  0.2  4.0   0.2  1  99.0
2  0.3  0.3  22.0  5  88.0
3  0.4  0.4   0.4  4  77.0
  

2)同样在数据帧的子集上使用fillna时,为什么嵌线不起作用。

我认为原因是chained assignments,需要分配回来。

  

3)如何沿行填充(已实现)?

如果分配回来,可以通过向前填充很好地替换:

df1 = df.fillna(method='ffill',axis=1)
print (df1)
     A    B     C    D     E
0  0.1  2.0  55.0  0.0   0.0
1  0.2  4.0   4.0  1.0  99.0
2  0.3  0.3  22.0  5.0  88.0
3  0.4  0.4   0.4  4.0  77.0

df2 = df.fillna(method='ffill',axis=0)
print (df2)
     A    B     C  D     E
0  0.1  2.0  55.0  0   NaN
1  0.2  4.0  55.0  1  99.0
2  0.3  4.0  22.0  5  88.0
3  0.4  4.0  22.0  4  77.0