У вас есть следующие возможности для решения проблемы с CERTIFICATE_VERIFY_FAILED
:
--cert
или CA_BUNDLE
для укажите альтернативный комплект СА. Например. вы можете перейти к неудачному URL из веб-браузера и импортировать корневой сертификат в свою систему. python -c "import ssl; print(ssl.get_default_verify_paths())"
, чтобы проверить текущий (проверьте, существует ли). SSL_CERT_DIR
, SSL_CERT_FILE
), которые могут использоваться для указания другой базы данных сертификатов PEP-476 . --trusted-host
, чтобы отметить хост как доверенный. verify=False
для requests.get
(см. Проверка сертификата SSL ). --proxy
, чтобы избежать проверки сертификатов. Подробнее: Обертка TLS / SSL для объектов сокетов - Проверка сертификатов .
Одно из решений, которое приходит на ум, - это сначала отсортировать объединенный кадр данных по годам с помощью функции sortvalues: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values. html затем удаляет дубликаты с параметром keep = 'first'
df.drop_duplicates(subset=['Name', 'Unit', 'Level'], keep="first")
Используйте sort_values
с параметром по умолчанию na_position='last'
, поэтому следует пропустить, а затем drop_duplicates
:
print (df)
Name Unit Year Level
0 Nik 1 NaN 12
1 Nik 1 2000.0 12
2 John 2 2001.0 11
3 John 2 2001.0 11
4 Stacy 1 NaN 8
5 Stacy 1 1999.0 8
subset = ['Name', 'Unit', 'Level']
df = df.sort_values('Year').drop_duplicates(subset)
Или: [1113 ]
df = df.sort_values(subset + ['Year']).drop_duplicates(subset)
print (df)
Name Unit Year Level
5 Stacy 1 1999.0 8
1 Nik 1 2000.0 12
2 John 2 2001.0 11
Другое решение с GroupBy.first
для возврата первого не пропущенного значения Year
для групп:
df = df.groupby(subset, as_index=False, sort=False)['Year'].first()
print (df)
Name Unit Level Year
0 Nik 1 12 2000.0
1 John 2 11 2001.0
2 Stacy 1 8 1999.0
Я бы посоветовал вам взглянуть на этап создания вашего объединенного набора данных.
При объединении наборов данных вы можете сделать это по нескольким индексам, т. Е.
df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'], suffixes=['', '_r'])
С помощью внешнего объединения вы сразу же собираете все наборы данных и удаляете дубликаты. Осталось только объединить столбец Year, который вы можете сделать следующим образом:
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
Это заполнит пробелы, после чего вы сможете просто удалить столбец Year_r.
Преимущество заключается в том, что охватываются не только значения NaN пропущенных лет, но и пропущенные годы, которые представлены в виде пустых строк.
После небольшого рабочего примера:
import pandas as pd
import numpy as np
left = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo', 'Peter', 'Adam'],
'Unit': ['2', '4', '6', '2', '4', '12'],
'Year': ['', '2009', '1954', '2025', '2012', '2024'],
'Level': ['L1', 'L1', 'L0', 'L4', 'L3', 'L10']})
right = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo'],
'Unit': ['2', '4', '6', '2'],
'Year': ['2010', '2009', '1954', '2025'],
'Level': ['L1', 'L1', 'L0', 'L4']})
df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'], suffixes=['', '_r'])
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
df