我有一个像这样的数据集:
A | B |
---|---|
x | a |
x | 南 |
y | c |
z | d |
假设我想更改最后两行并将这些值替换为同一列中之前的非 nan 值以获得此数据集:
A | B |
---|---|
x | a |
x | 南 |
x | a |
x | a |
如何获得这个?
您可以创建一个系列,将 NA 值之前的最后一项分组到下一次值位于 NA 之前的时间。然后使用该系列和每个组执行
groupby
操作以获得第一个值。但是,您需要将第一个 NA 之前的分组 ID 替换为 0 以外的值,这样它们就不会分组在一起。transform
这采用原始数据框:
import pandas as pd
df = pd.DataFrame({
'A':list('xxyzwetqyw'),
'B':[*list('aba'), pd.NA, *list('cd'), pd.NA, *list('iip')]
})
g = df.isna().any(axis=1).cumsum().shift(-1).ffill()
g[g.eq(0)] += list(range(-g.eq(0).sum(),0))
df.groupby(g).transform('first')
并将其转换为:
A B
0 x a
1 x b
2 y a <- value above NA
3 z <NA>
4 w c
5 e d <- value above NA
6 t <NA>
7 q i
8 y i
9 w p