Заменить дату с одного кадра данных на другой, если он новее - PullRequest
1 голос
/ 30 января 2020

Итак, я наткнулся на стену и чувствую, что все довольно просто, но не могу заставить ее работать.

У меня есть два кадра данных, которые я хочу сравнить и обновить один с датой другого если оно более новое дата обновления SAH-459 до 30.01.2009, поскольку она более новая

Вот что я сделал до сих пор:

unitlist = df1['Unit Number'].unique()    #gets array with unique Unit Numbers

for unit in unitlist:
    date1 = df1.loc[df1['Unit Number'] == unit, 'Date'].values
    date2 = df2.loc[df2['Unit number'] == unit, 'ActualDate].values

    if date2 > date1:
        df1.at[[unit],'Date'] = date2

Однако выдает эту ошибку:

"None of [Index(['SAH-459'], dtype='object')] are in the [index]"

Я должен сказать, что список уникальных модулей обоих кадров данных не совпадает. Из df1 в df2 и наоборот могут отсутствовать некоторые единицы.

Заранее спасибо!

1 Ответ

0 голосов
/ 30 января 2020

Случай 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"]

Это будет всегда работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...