Как правильно вменять эти значения NaN в режимы другого столбца? - PullRequest
0 голосов
/ 10 апреля 2019

Я учусь обрабатывать пропущенные значения в наборе данных.У меня есть таблица с ~ 1 миллион записей.Я пытаюсь справиться с небольшим количеством пропущенных значений.

Мои данные относятся к системе совместного использования велосипедов, а мои пропущенные значения относятся к начальной и конечной точкам.

Данные: пропущенные стартовые станции,только 7 значений

enter image description here

Данные: отсутствует конечная станция, всего 24 значения

enter image description here

Я хочу заполнить NaN в обоих случаях режимом "противоположной" станции.Например, для start_station==21 я хочу посмотреть, что является наиболее распространенным end_station, и использовать его для заполнения пропущенного значения.Например, df.loc[df['start_station'] == 21].end_station.mode()

Я пытался добиться этого с помощью функции:

def inpute_end_station(df):
    for index, row in df.iterrows():    
        if pd.isnull(df.loc[index, 'end_station']):

            start_st = df.loc[index, 'start_station']
            mode = df.loc[df['start_station'] == start_st].end_station.mode()
            df.loc[index, 'end_station'].fillna(mode, inplace=True)

Последняя строка выдает AttributeError: 'numpy.float64' object has no attribute 'fillna'.Если вместо этого я просто использую df.loc[index, 'end_station'] = mode, я получаю ValueError: Incompatible indexer with Series.

Правильно ли я подхожу к этому?Я понимаю, что неправильно модифицировать то, что вы повторяете в пандах, так как правильно изменить столбцы start_station и end_station и заменить NaN на соответствующий режим дополнительной станции?

1 Ответ

1 голос
/ 10 апреля 2019

По моему мнению, когда вы хотите перебрать столбец в пандах, как это, лучше всего использовать функцию apply().

Для этого конкретного случая я бы предложил следующий подход, который показан ниже на моих выборочных данных. У меня нет большого опыта использования метода mode(), поэтому я использовал метод value_counts() в сочетании с методом first_valid_index() для определения значения режима.

# import pandas
import pandas as pd

# make a sample data
list_of_rows = [
  {'start_station': 1, 'end_station': 1},
  {'start_station': None, 'end_station': 1},
  {'start_station': 1, 'end_station': 2},
  {'start_station': 1, 'end_station': 3},
  {'start_station': 2, 'end_station': None},
  {'start_station': 2, 'end_station': 3},
  {'start_station': 2, 'end_station': 3},
]

# make a pandas data frame
df = pd.DataFrame(list_of_rows)

# define a function
def fill_NaNs_in_end_station(row):
    if pd.isnull(row['end_station']):
        start_station = row['start_station']
        return df[df['start_station']==start_station].end_station.value_counts().first_valid_index()
    return row['end_station']

# apply function to dataframe
df['end_station'] = df.apply(lambda row: fill_NaNs_in_end_station(row), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...