Я хочу заполнить столбец вперед и указать лимит, но я хочу, чтобы лимит основывался на индексе, а не на простом числе строк, как позволяет лимит.
Например, скажем, у меня есть фрейм данных, заданный как:
df = pd.DataFrame({
'data': [0.0, 1.0, np.nan, 3.0, np.nan, 5.0, np.nan, np.nan, np.nan, np.nan],
'group': [0, 0, 0, 1, 1, 0, 0, 0, 1, 1]
})
, который выглядит как
In [27]: df
Out[27]:
data group
0 0.0 0
1 1.0 0
2 NaN 0
3 3.0 1
4 NaN 1
5 5.0 0
6 NaN 0
7 NaN 0
8 NaN 1
9 NaN 1
Если я группирую по столбцу group
и выполняю прямую заливкув этой группе с limit=2
, тогда мой результирующий фрейм данных будет
In [35]: df.groupby('group').ffill(limit=2)
Out[35]:
group data
0 0 0.0
1 0 1.0
2 0 1.0
3 1 3.0
4 1 3.0
5 0 5.0
6 0 5.0
7 0 5.0
8 1 3.0
9 1 NaN
Однако то, что я на самом деле хочу здесь, это только прямая заливка в строки, индексы которых находятся в пределах, скажем, 2 от первого индекса каждогогруппа, в отличие от следующих 2 строк каждой группы.Например, если мы просто посмотрим на группы в кадре данных:
In [36]: for i, group in df.groupby('group'):
...: print(group)
...:
data group
0 0.0 0
1 1.0 0
2 NaN 0
5 5.0 0
6 NaN 0
7 NaN 0
data group
3 3.0 1
4 NaN 1
8 NaN 1
9 NaN 1
Я бы хотел, чтобы вторая группа здесь была заполнена только до индекса 4 --- не 8 и 9. NaN первой группывсе значения находятся в пределах 2 индексов от последних значений, отличных от NaN, поэтому они будут заполнены полностью.Результирующий кадр данных будет выглядеть так:
group data
0 0 0.0
1 0 1.0
2 0 1.0
3 1 3.0
4 1 3.0
5 0 5.0
6 0 5.0
7 0 5.0
8 1 NaN
9 1 NaN
FWIW в моем фактическом случае использования, мой индекс - DateTimeIndex (и он отсортирован).
В настоящее время у меня есть решение, которое работаеттребуя циклически проходить через фрейм данных, отфильтрованный по групповым индексам, создавать временной диапазон для каждого отдельного события со значением, отличным от NaN, на основе индекса, а затем объединять их.Но это слишком медленно, чтобы быть практичным.