Случай 1: одни и те же единицы в обоих фреймах данных Давайте сначала создадим 2 фрейма данных с:
df1 = pd.DataFrame(
{
"Unit_Number": ["SAH-459", "SAH-450", "SAH-399"],
"Date": ["1/24/2019", "2/3/2019", "10/5/2019"],
"Score": [0.951, 0.852, 0.354],
}
)
df2 = pd.DataFrame(
{
"Unit_Number": ["SAH-459", "SAH-450", "SAH-399"],
"ActualDate": ["1/30/2019", "2/3/2019", "9/28/2019"],
}
)
Чтобы выполнить обновление, вы должны установить Unit_Number
в качестве индекса и преобразовать столбцы дат в datetime с помощью:
# Set index
df1 = df1.set_index("Unit_Number")
df2 = df2.set_index("Unit_Number")
# Transform to date
df1["Date"] = pd.to_datetime(df1["Date"])
df2["ActualDate"] = pd.to_datetime(df2["ActualDate"])
Так что теперь вы можете создать фильтр, чьи единицы имеют дату в df2
, которая больше даты в df1
и использовать его для обновления дат этих единиц в df1
:
mfilter = df2["ActualDate"] > df1["Date"]
df1.loc[mfilter, "Date"] = df2.loc[mfilter, "ActualDate"]
Это будет работать, если оба кадра данных имеют одинаковые единицы и в тот же порядок .
И если вам это нужно, вы можете сбросить индексы после выполнения этого обновления с помощью:
df1 = df1.reset_index()
df2 = df2.reset_index()
Случай 2: разные единицы в обоих фреймы данных
Давайте добавим больше единиц для проверки этого случая:
df1 = pd.DataFrame(
{
"Unit_Number": ["SAH-459", "SAH-450", "SAH-399", "SAH-777"],
"Date": ["1/24/2019", "2/3/2019", "10/5/2019", "4/29/2019"],
"Score": [0.951, 0.852, 0.354, 0.982],
}
)
df2 = pd.DataFrame(
{
"Unit_Number": ["SAH-459", "SAH-450", "SAH-399", "SAH-999"],
"ActualDate": ["1/30/2019", "2/3/2019", "9/28/2019", "1/12/2019"],
}
)
Вам нужно будет сделать то же самое:
df1 = df1.set_index("Unit_Number")
df2 = df2.set_index("Unit_Number")
# Transform to date
df1["Date"] = pd.to_datetime(df1["Date"])
df2["ActualDate"] = pd.to_datetime(df2["ActualDate"])
Они ключ для переиндексации mfilter
используя индекс из df1
и затем переиндексировать mfilter
в df2.loc
:
mfilter = df2["ActualDate"].reindex(df1.index) > df1["Date"]
df1.loc[mfilter, "Date"] = df2.loc[mfilter.reindex(df2.index).fillna(False), "ActualDate"]
Это будет всегда работать