Checker для обновления уже существующих данных в датафрейме Python - PullRequest
0 голосов
/ 24 января 2019

У меня есть файл Excel в фрейме данных old_df, с которым я постоянно обновляю данные, добавляя новые дополнения из другого фрейма данных файла Excel new_df.Я просто pd.concat вижу новые и старые кадры вместе, если одна из дат в новом кадре данных не существует в старом.

В настоящее время некоторые из важных столбцов в этом файле:

Pub Date      Forecast Time   Forecast Date   State   Temp
2018-12-12    23:00:00        2018-12-20      AK      3
2018-12-12    02:00:00        2018-12-20      AK      3.2
2018-12-12    05:00:00        2018-12-20      AK      2.9
.
.

Я хочу удостовериться, что выдаю повторяющиеся строки при обновлении этого старого файла новыми данными - пропуская неуникальные экземпляры Pub Date с Forecast Time, Forecast Date и State.

Прямо сейчас я использую довольно плохой метод для этого, беря список Pub Dates для нового и старого:

dateList_old = date_old.tolist()
dateList_new = date_new.tolist()

result = any(elm in dateList_new for elm in dateList_old)

if result == True:
    print('One or more of the dates already exists in the database')
    sys.exit()

else:

    frames = [old_df,new_df]

    result = pd.concat(frames)
    result.to_excel("file", encoding="utf-8", index=False)

Но это столкнется с проблемами, потому что, скажем, если яЯ должен был добавить один и тот же Pub Date любого вида - он завершил бы всю запись.

Я хотел бы сделать так, чтобы, если Pub Date + Forecast Time + Forecast Date + State находится в old_df, тогда пропустить и продолжить запись всех остальныхнесуществующие строки, которые выходят из , только если все эти комбинации уже существуют .

Есть ли простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы также можете использовать:

df.append(df1,ignore_index=True).drop_duplicates(subset=['Pub Date','Forecast Time','Forecast Date','State'])

Рассматривая два кадра данных как:

df:

    Pub Date Forecast Time Forecast Date State  Temp
0 2018-12-12      23:00:00    2018-12-20    AK   3.0
1 2018-12-12      02:00:00    2018-12-20    AK   3.2
2 2018-12-12      05:00:00    2018-12-20    AK   2.9

df1:

    Pub Date Forecast Time Forecast Date State  Temp
0 2018-12-12      23:00:00    2018-12-20    AK   3.0
1 2018-12-13      02:00:00    2018-12-20    AK   3.2
2 2018-12-13      05:00:00    2018-12-20    AK   2.9

df.append(df1,ignore_index=True).drop_duplicates(subset=['Pub Date','Forecast Time','Forecast Date','State'])

    Pub Date Forecast Time Forecast Date State  Temp
0 2018-12-12      23:00:00    2018-12-20    AK   3.0
1 2018-12-12      02:00:00    2018-12-20    AK   3.2
2 2018-12-12      05:00:00    2018-12-20    AK   2.9
4 2018-12-13      02:00:00    2018-12-20    AK   3.2
5 2018-12-13      05:00:00    2018-12-20    AK   2.9

В основном добавление как кадров данных, так и удаление дубликатов только на основе определенных столбцов, которые ['Pub Date','Forecast Time','Forecast Date','State']

0 голосов
/ 24 января 2019

Подводя итог вашему вопросу: у вас есть два фрейма данных ("старый" и "новый"), и вы хотите объединить строки из "нового", которые еще не существуют в "старом" (на основе дат вашего паба, времени прогноза, так далее.). Правильно?

Вы можете сделать логическую индексацию. Например, определите строки, в которых выполняются ВСЕ условия в обоих кадрах данных.

idx = ((old['Pub Date'] == new['Pub Date'])
       & (old['Forecast Time'] == new['Forecast Time'])
       & (old['Forecast Date'] == new['Forecast Date'])
       & (old['State'] == new['State'])

if ~np.all(idx==False):
    # now concatenate the new data onto the old dataframe.
    old = pd.concat([old, new.loc[~idx, :], axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...