Почему при использовании .apply в фрейме данных pandas это дает неверный результат? Моя версия петли работает

У меня есть два Pandas DataFrames:

  1. df_topics_temp contains матрица со столбцом id
  2. df_mapping contains отображение id в parentID

Я пытаюсь заполнить столбец parent.id в df_topics_tempparentID в df_mapping.

Я написал решение с использованием циклов, хотя оно очень громоздкое. Оно работает. Мое решение с использованием панд .apply для df_topics_temp не работает

Решение 1 (работает):


def isnan(value):
  try:
      import math
      return math.isnan(float(value))
  except:
      return False

for x in range(0, df_topics_temp['id'].count()):
    topic_id_loop = df_topics_temp['topic.id'].iloc[x]
    mapping_row = df_mapping[df_mapping['id'] == topic_id_loop]
    parent_id = mapping_row['parentId'].iloc[0]
    
    if isnan(parent_id):
        df_topics_temp['parent.id'].iloc[x] = mapping_row['id'].iloc[0]
    else:     
        df_topics_temp['parent.id'].iloc[x] = topic_id_loop

Решение 2 (не работает):


def map_function(x):
        df_topics_temp = df_mapping.loc[df_mapping['id'] == x]
        temp = df_topics_temp['parentId'].iloc[0]
        return temp

df_topics_temp['parent.id'] = df_topics_temp['topic.id'].apply(map_function)

df_topics_temp.head() 

Второе решение (панды .apply) не заполняет столбец parent.id в df_topics_temp.

Спасибо вам за помощь

Обновление 1

<ipython-input-68-a2e8d9a21c26> in map_function(row)
      1 def map_function(row):
----> 2         row['parent.id'] = df_mapping.loc[df_mapping['id']==row['topic.id']]['parentId'].values[0]
      3         return row

IndexError: ('index 0 is out of bounds for axis 0 with size 0', 'occurred at index 190999')

Во-первых, я думаю, что вам не нужно переопределять isnan, версия numpy должна работать.

Itamar Mushkin 28.03.2019 08:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, «применить» принимает строку и возвращает строку. Итак, вы хотите, чтобы ваша функция возвращала строку. Ваш возвращает значение. Например:

#setting up the dataframes
import pandas as pd
import numpy as np
df1 = pd.DataFrame.from_dict({'name':['alice','bob'],'id':[1,2]})
mapping = pd.DataFrame.from_dict({'id':[1,2,3,4],'parent_id':[100,200,100,200]})

#mapping function
def f(row):
    if any(mapping['id']==row['id']):
        row['parent_id'] = mapping.loc[mapping['id']==row['id']]['parent_id'].values[0]
    else: # missing value
        row['parent_id'] = np.nan
    return row

df1.apply(f,axis=1)

Большое спасибо, Итамар. В этом есть смысл. Я это попробую

Jonathan Kruger 31.03.2019 10:15

См. Обновление 1 в моем исходном сообщении выше. Это ошибка, которую я получаю, когда применяю код, который вы предложили, к моему кадру данных. Пожалуйста помоги

Jonathan Kruger 03.04.2019 07:47

Прежде всего, убедитесь, что строка-нарушитель (190999) имеет законного "родителя" по идентификатору, и это не проблема в данных.

Itamar Mushkin 03.04.2019 09:45

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

Itamar Mushkin 03.04.2019 10:13

Пожалуйста. Если ответ помог и проблема решена, я думаю, вам следует «принять» ответ.

Itamar Mushkin 07.04.2019 07:18

Я сделал это сейчас. Извините, я впервые использую stackoverflow. Я теперь знаю, что делать и не говорить "спасибо" в комментариях. Однако я ценю вашу помощь.

Jonathan Kruger 07.04.2019 15:16

Я тоже новичок здесь. Удачного программирования!

Itamar Mushkin 07.04.2019 18:47

Другие вопросы по теме