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-composition
inplace=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