Рекурсивное обновление Python на основе условия

1

Я использую панды и имею два кадра данных:

df1:

    id date status rpbid rpfid
     1  d1   closed null  10
     2  d2   closed null  11
     3  d3   closed null  null

и df2:

     id date status  rpbid rpfid
     10 d10  updated 1     null
     11 d11  updated 2     9
     9  d9   updated 11    null

Идея состоит в том, что я хотел бы обрабатывать два случая: 1. где закрытая запись была первой и последней записью для этого экземпляра (id 3 в df1), 2. где в закрытой записи есть еще одна обновленная запись, связанная в df2. rfbid и rpbid предназначены для replacedbyid и replacementforid Таким образом, в результате ДФ будет:

id date status rpbid rpfid id2 date2 rpbid2 rpfip2
1  d1   closed null  10    10  d10   1      null
2  d2   closed null  11    9   d9    11     null
3  d3   closed null  null  null null  null   null

До сих пор я пробовал сделать первое левое соединение на df1 и df2, чтобы получить все первые рекурсивные соединения, затем я попытался использовать цикл, чтобы проверить, был ли rpbid2 нулевым, если бы я не посмотрел на df1 для значения rpdid2 в столбце id df2 мне хотелось бы обновить эту вторую половину объединенного фрейма данных, чтобы быть следующим шагом в соединении, где это применимо.

Вот исходный код: я не смог получить его не из-за ошибки

import pandas as pd

df = pd.read_csv(filename)


df_initial = df.loc[df['LetterStatus']=='CLOSED']
dfx = df.loc[df['LetterStatus']=='UPDATED']


df_merged = pd.merge(df_initial,dfx,how='left',left_on='ReferenceNumber',right_on='ReplacedByRefNumber')
df_copy = df_merged
for row in range(len(df_merged)):
    if  len(str(df_merged.iloc[row]['ReplacedByRefNumber_y'])) > 1:
        row_slice = dfx.iloc[['ReferenceNumber']==df_merged[row['ReplacedByRefNumber_y']]
        if row_slice.size == 0:
            df_merged.iloc[row]['ReplacedByRefNumber_y']='Unknown'
            df_copy.iloc[row]['ReplacedByRefNumber_y']='Unknown'
        else:
            df_copy.iloc[row][24:0]=row_slice


print(df_copy)

Для большего контекста; если replacebyID равен null, а статус "обновлен", это означает, что это была первая запись для данного заданного порядка.

  • 0
    Можете ли вы опубликовать код, который вы использовали, и показать, что он возвращает? Таким образом, мы можем увидеть, как это отличается от ваших ожиданий
  • 0
    Также, если вы не включили в контекст данные, которыми вы пытаетесь манипулировать, вместо того, чтобы использовать «зашифрованные» имена переменных / полей, вам придется поместить ваши данные в минимальный пример, воссоздающий вашу проблему в аналогичной ситуации, потому что я нахожу очень трудно понять происходящие преобразования, чтобы получить желаемый df
Показать ещё 4 комментария
Теги:
pandas
dataframe

1 ответ

0

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

Для того, что я вижу, у вас есть два кадра данных, которые имеют взаимные привязки в каждом из них для обновления своего контента; проблема заключается в том, что вы показываете пример, в котором строка, которая должна обновлять другой элемент в другом кадре данных, также должна быть обновлена.

Вы нарушаете структуру данных и идентификацию строк. Я не очень понимаю, ссылаются ли ссылки id в каждом кадре данных на строку в своем собственном кадре данных или в другом; ID не сортируются по заказу включения. Когда вы создаете свой общий фрейм данных, вы рекурсивно включаете столбец, который все еще будет заменять данные, делая ваш фрейм данных горизонтальным, без фактической цели.

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

  1. Если вы хотите обновлять данные, лучшим способом будет использование модели данных, в которой таблица из базы данных правильно отформатирована (вы все равно можете использовать pandas, кадры данных могут быть вашими таблицами). Вы можете обновлять данные, когда запрос на обновление поступает прямо туда, где находится обновляемый контент, вместо сохранения отдельной записи обновлений, которые в то же время сами выполняют запросы на обновление. Это очень грязно. Если вы хотите сохранить учетную запись обновлений, у вас должна быть постоянно обновляемая таблица, а затем другая таблица, в которой будет отображаться запись каждой уже выполненной манипуляции в таблицу. Вы можете сохранить в последнем предыдущее значение и значение, для которого оно было обновлено.

  2. Вы должны правильно назвать свои фреймы данных, и когда вы делаете ссылку на идентификатор в другом фрейме данных, это имя поля должно по своей сути указывать на то, что ссылка на этот фрейм данных.

  3. Вы можете включать даты в поле, вам не нужно ссылаться на другую таблицу. Это не выглядит хорошо. Просто используйте модуль datetime.datetime и дамп объекта в фрейм данных; Python заботится обо всем остальном.

  4. Имена переменных тоже должны быть несколько пояснений: вместо того, чтобы использовать rpbid, и того, чтобы объяснить всем, что означает replacedbyid, просто используйте replaced_by_id (обратите внимание на знак подчеркивания для разделения слов).

  • 0
    JC - Я не создавал эту базу данных и не создавал ее, я пытаюсь работать с тем, что мне дали, и меня попросили найти решения, чтобы ответить на некоторые деловые вопросы, моя цель состояла в том, чтобы ограничить таблицу до ширины одного соединения, и обновите соединение на месте с дальнейшими находками, а не с непрерывным расширением, так как мне не важны средние шаги, только первый и последний.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню