Я использую панды и имею два кадра данных:
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, а статус "обновлен", это означает, что это была первая запись для данного заданного порядка.
Отказ от ответственности: вместо того, чтобы попытаться выяснить суть вопроса о том, как получить этот фрейм данных, я намерен с этим ответом скорее убедиться, что вы абсолютно уверены в том, что вы делаете, и, возможно, поможете вам структурировать ваши данных немного лучше.
Для того, что я вижу, у вас есть два кадра данных, которые имеют взаимные привязки в каждом из них для обновления своего контента; проблема заключается в том, что вы показываете пример, в котором строка, которая должна обновлять другой элемент в другом кадре данных, также должна быть обновлена.
Вы нарушаете структуру данных и идентификацию строк. Я не очень понимаю, ссылаются ли ссылки id в каждом кадре данных на строку в своем собственном кадре данных или в другом; ID не сортируются по заказу включения. Когда вы создаете свой общий фрейм данных, вы рекурсивно включаете столбец, который все еще будет заменять данные, делая ваш фрейм данных горизонтальным, без фактической цели.
Я думаю, что вы попытались сделать свой собственный способ обновления данных, и теперь вы сталкиваетесь с проблемами, которые в противном случае вы бы не использовали, если бы использовали структуру данных, которая является более распространенной и уже продуманной, чтобы быть масштабируемой и простой в управлении.
Если вы хотите обновлять данные, лучшим способом будет использование модели данных, в которой таблица из базы данных правильно отформатирована (вы все равно можете использовать pandas, кадры данных могут быть вашими таблицами). Вы можете обновлять данные, когда запрос на обновление поступает прямо туда, где находится обновляемый контент, вместо сохранения отдельной записи обновлений, которые в то же время сами выполняют запросы на обновление. Это очень грязно. Если вы хотите сохранить учетную запись обновлений, у вас должна быть постоянно обновляемая таблица, а затем другая таблица, в которой будет отображаться запись каждой уже выполненной манипуляции в таблицу. Вы можете сохранить в последнем предыдущее значение и значение, для которого оно было обновлено.
Вы должны правильно назвать свои фреймы данных, и когда вы делаете ссылку на идентификатор в другом фрейме данных, это имя поля должно по своей сути указывать на то, что ссылка на этот фрейм данных.
Вы можете включать даты в поле, вам не нужно ссылаться на другую таблицу. Это не выглядит хорошо. Просто используйте модуль datetime.datetime
и дамп объекта в фрейм данных; Python заботится обо всем остальном.
Имена переменных тоже должны быть несколько пояснений: вместо того, чтобы использовать rpbid
, и того, чтобы объяснить всем, что означает replacedbyid, просто используйте replaced_by_id
(обратите внимание на знак подчеркивания для разделения слов).