Обновите значения ячеек, в которых отсутствуют данные, используя функцию построчно - PullRequest
0 голосов
/ 31 мая 2019

Предположим, у меня есть DataFrame, который выглядит примерно так:

In [1]: df = pd.DataFrame([['name1', 2, 3, 'red'], ['name2', 4, 5, 'orange'], ['name3', 6, 7, '-'], ['name4', 8, 9, '-']], \
              columns=('names', 'data1', 'data2', 'category'))
        df

Out[1]:
     name   data1   data2   category
0   name1       2       3        red
1   name2       4       5     orange
2   name3       6       7          -
3   name4       8       9          -

Для некоторых строк в некоторых столбцах отсутствуют данные, которые обозначаются знаком '-':

Что я хочу сделать, так это заполнить пропущенные данные построчно. Существует функция, которая может определить правильную категорию для каждой строки, если ей передано имя. Я использовал произвольные термины, чтобы сделать вопрос общим и широким, поскольку фактическая функция извлекает данные из базы данных. Например:

In [2]: import library as lib
        lib.get_category('name1')

Out[2]: ['red']

Как мне обновить все пропущенные значения, используя функцию построчно? Я попытался использовать df.loc, чтобы получить все строки с пропущенными данными и передать в серию соответствующие имена, но он обновляет только все пропущенные значения с последним значением в серии. Я считаю, что основная проблема здесь заключается в правильной итерации.

Окончательный ожидаемый результат должен выглядеть примерно так (при условии, что lib.get_category ('name3') возвращает ['yellow'], а lib.get_category ('name4') возвращает ['green']:

Out[1]:
     name   data1   data2   category
0   name1       2       3        red
1   name2       4       5      orange
2   name3       6       7      yellow
3   name4       8       9       green

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Попробуйте это:

df.loc[df.category.astype('str')=='-','category']=df[df.category.astype('str')=='-']['names'].apply(lib.get_category)

Просто используйте функцию apply с loc, чтобы найти строки, к которым нужно применить.

0 голосов
/ 31 мая 2019

Use может использовать Series.apply для этого:

import library as lib
def func(name):
    return lib.get_category('name1')

df['category'] = df['name'].apply(func)

Функция apply func будет принимать значения из столбца name и возвращать значение для соответствующей строки.Поэтому отредактируйте свою функцию соответствующим образом.

Также обратите внимание, что приведенный выше код заменит существующее значение категории столбца.Но поскольку вы упомянули, что категория может быть получена из названия, то это не должно быть проблемой.

...