Преобразование отсутствующих данных столбца из доступных данных из того же столбца в кадре данных pandas?

avatar
vk087
8 августа 2021 в 16:05
34
3
0

Я пытаюсь заполнить недостающие данные в моем фрейме данных pandas. Однако эти данные могут быть заполнены только определенным нетрадиционным способом. Сначала я пометил отсутствующие данные с помощью -1, поэтому я хочу заменить значение -1 определенным образом.

Столбец А Столбец B
12 11
99 -1
43 34
23 -1
65 -1
17 42
12 66
99 -1
43 22
23 -1
65 -1
17 42

Я хочу заменить каждое отсутствующее значение или -1 следующим доступным положительным значением из того же столбца.

Столбец А Столбец B
12 11
99 34
43 34
23 42
65 42
17 42
12 66
99 22
43 22
23 42
65 42
17 42

Я могу получить желаемый результат, если количество непрерывных -1 остается постоянным, используя df['col].shift(1), однако это не сработает, потому что здесь размещение -1 случайное.

Размер данных, с которыми я имею дело, довольно велик.

Источник

Ответы (3)

avatar
norie
8 августа 2021 в 16:12
3

Для этого можно использовать replace с bfill.

df['ColumnB'] = df['ColumnB'].replace(-1, method='bfill')

print(df)

Sample Output
    ColumnA  ColumnB
0        12       11
1        99       34
2        43       34
3        23       42
4        65       42
5        17       42
6        12       66
7        99       22
8        43       22
9        23       42
10       65       42
11       17       42
avatar
Asish M.
8 августа 2021 в 16:13
1

Использовать pd.Series.bfill


In [24]: s = pd.Series([11, -1, 34, -1, -1, 42, 66, -1, 22, -1, -1, 42])

In [26]: s.replace({-1: np.nan}).bfill()
Out[26]:
0     11.0
1     34.0
2     34.0
3     42.0
4     42.0
5     42.0
6     66.0
7     22.0
8     22.0
9     42.0
10    42.0
11    42.0
dtype: float64
avatar
Anurag Dabas
8 августа 2021 в 16:12
2

использовать replace()+bfill():

df['Column B']=df['Column B'].replace(-1,float('nan')).bfill(downcast='infer')

вывод df:

  Column A  Column B
0   12      11
1   99      34
2   43      34
3   23      42
4   65      42
5   17      42
6   12      66
7   99      22
8   43      22
9   23      42
10  65      42
11  17      42