Замените значение «NaN» последним допустимым значением только для одного столбца в кадре данных с многоиндексным столбцом (df.fillna) - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю с Python 3.6.5.

Вот небольшой скрипт для генерации мультииндексного фрейма данных с некоторым значением "NaN".

import pandas as pd
import numpy as np

att_1 = ['X', 'Y']
att_2 = ['a', 'b']

df_1 = pd.DataFrame(np.random.randint(10,19,size=(5, 2)), columns=att_2, 
index=[10,20,30,35,40])
df_2 = pd.DataFrame(np.random.randint(20,29,size=(5, 2)), columns=att_2, 
index=[20,25,40,50,80])

# Concat df with new key dimension for column attribute
df = pd.concat([df_1, df_2], keys=att_1, axis=1)

Я получаю этот фрейм данных

print(df)
       X           Y      
       a     b     a     b
10  17.0  17.0   NaN   NaN
20  15.0  11.0  20.0  28.0
25   NaN   NaN  23.0  24.0
30  12.0  16.0   NaN   NaN
35  10.0  10.0   NaN   NaN
40  15.0  14.0  25.0  28.0
50   NaN   NaN  22.0  22.0
80   NaN   NaN  23.0  21.0

И я хотел бы заменить значение «NaN» последним действительным значением, НО ТОЛЬКО ДЛЯ ОДНОЙ КОЛОННЫ.Например, я хотел бы получить это (для столбца с именем 'X', 'b')

print(df)
       X           Y      
       a     b     a     b
10  17.0  17.0   NaN   NaN
20  15.0  11.0  20.0  28.0
25   NaN  11.0  23.0  24.0
30  12.0  16.0   NaN   NaN
35  10.0  10.0   NaN   NaN
40  15.0  14.0  25.0  28.0
50   NaN  14.0  22.0  22.0
80   NaN  14.0  23.0  21.0

Я пробовал это:

# Replace NaN value by last valid value for column named 'X','b'
df['X']['b'].fillna(method='ffill', inplace=True)

Но я получаю эту ошибку «Значение пытается быть установлено для копии фрагмента из DataFrame»

Я не могу найти никакого решения для фрейма данных с многоиндексным столбцом.Я нашел эту ссылку, которая не дает мне надежды.(https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.MultiIndex.fillna.html)

У кого-нибудь есть идеи, чтобы помочь мне?

1 Ответ

0 голосов
/ 12 декабря 2018

После некоторых копаний я обнаружил, что есть более подходящий способ ссылки на столбцы, которые мы хотим редактировать специально.Проверьте Как бороться с SettingWithCopyWarning в Pandas? для получения дополнительной информации.Другой ресурс: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy.

Рекомендуется использовать .loc для изменения столбцов.Использование строки ниже позволило устранить все ошибки.

df.loc[df['X']['b'].isnull(), ('X', 'b')] = df['X']['b'].ffill()

Однако здесь я использую максимум столбца для замены каждого NaN на.Я не уверен, что подразумевается под последним действительным значением.

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