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”中的值替换列B
和C
中的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
我尝试将fill
与axis 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
尝试使用B
用C
用0
填充inplace
和df[['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
中的值来填充列A
和ffill
中的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)
(已实现)?
答案 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