2

假设我有一个看起来像这样的数据框:

df =
       0    1    2
  0  1.0  2.0  3.0
  1  4.0  5.0  NaN
  2  6.0  NaN  NaN

然后可以使用df.fillna(method='ffill', axis=1)获得:

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0  5.0
2  6.0  6.0  6.0

即我转发填充行。但是,现在我有一个数据框,-1而不是np.nan. Pandas 具有replace也可以使用的函数method='ffill',但replace()不接受轴参数,因此要获得与上述相同的结果,我需要调用df.T.replace(-1, method='ffill').T. 由于转置非常昂贵(特别是考虑到我正在处理数 GB 的数据帧),所以这不是一个选择。我怎样才能达到预期的结果?

4

3 回答 3

4

使用maskffill

df.mask(df.eq(-1)).ffill(axis=1)

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0  5.0
2  6.0  6.0  6.0
于 2018-06-18T14:59:43.537 回答
3

您可以在使用之前将您的-1值转换为:NaNpd.DataFrame.ffill

print(df)

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0 -1.0
2  6.0 -1.0 -1.0

res = df.replace(-1, np.nan)\
        .ffill(axis=1)

print(res)

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0  5.0
2  6.0  6.0  6.0
于 2018-06-18T14:57:11.427 回答
3

IIUC,使用mask和:ffillaxis=1

在哪里df1 = df.fillna(-1.0)

df1.mask(df1 == -1).ffill(1)

输出:

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0  5.0
2  6.0  6.0  6.0
于 2018-06-18T14:59:49.313 回答