Панды: заменить ячейку numpy.nan максимумом соседних ячеек, отличных от нан - PullRequest
0 голосов
/ 28 октября 2018

контрольный пример:

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                    [3, 4, np.nan, 1],
                    [np.nan, np.nan, np.nan, 5],
                    [np.nan, 3, np.nan, 4]],
                    columns=list('ABCD'))

, где A [i + 1, j], A [i - 1, j], A [i, j + 1], A [i, j - 1] - набор записей, смежных с A [i, j].

Во многих словах это:

     A    B   C  D
0  NaN  2.0 NaN  0
1  3.0  4.0 NaN  1
2  NaN  NaN NaN  5
3  NaN  3.0 NaN  4

должно стать следующим:

     A    B   C  D
0  3.0  2.0 2.0  0.0
1  3.0  4.0 4.0  1.0
2  3.0  4.0 5.0  5.0
3  3.0  3.0 4.0  4.0

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы можете использовать метод rolling в обоих направлениях, а затем найти максимум каждого.Затем вы можете использовать это, чтобы заполнить отсутствующие значения оригинала.

df1 = df.rolling(3, center=True, min_periods=1).max().fillna(-np.inf)
df2 = df.T.rolling(3, center=True, min_periods=1).max().T.fillna(-np.inf)
fill = df1.where(df1 > df2).fillna(df2)
df.fillna(fill)

Вывод

     A    B    C  D
0  3.0  2.0  2.0  0
1  3.0  4.0  4.0  1
2  3.0  4.0  5.0  5
3  3.0  3.0  4.0  4
0 голосов
/ 28 октября 2018

Вы можете заполнить NaN в каждом указанном вами направлении и взять максимум:

pd.concat([
    df.ffill(limit=1), 
    df.ffill(axis=1, limit=1), 
    df.bfill(limit=1), 
    df.bfill(axis=1, limit=1)]
).max(level=0)

Это предполагает, что у вас есть уникальные метки строк в исходном кадре данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...