Python 用数据框内另一列的值在多个列中填充Na
熊猫版Python 用数据框内另一列的值在多个列中填充Na,python,python-3.x,pandas,fillna,Python,Python 3.x,Pandas,Fillna,熊猫版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('
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
沿轴0
进行fillna,但没有给出预期的输出(从上一列填充)
输出:未实现错误:
也试过
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
尝试使用in place
将B
和C
中的所有Na填充为0
,但这也不会产生预期的输出
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
如果将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
1) 如何使用给定数据框中列A
中的值填充列B
和C
中的na值?2) 另外,在数据帧的子集上使用fillna时,为什么镶嵌不起作用。
3) 如何沿行执行
ffill
(是否已实施)
1) 如何使用给定数据框中A列的值填充B列C中的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
或:
2) 另外,在数据帧的子集上使用fillna时,为什么inlace不起作用
我想原因是,需要重新分配
3) 如何沿行进行ffill(是否已实现)
替换为正向填充工作良好,如果分配回:
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
你能告诉我为什么
ffill
在axis=0
上没有按预期工作吗?@Shijith-我认为bug-compositioninplace=True
和ffill
谢谢,我不知道在ffill
中分配回会起作用。
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
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