Вставка в таблицу БД с использованием SQL-запроса на основе теста, выполненного на фрейме данных pandas - PullRequest
0 голосов
/ 10 июля 2019

Предположим, у меня есть датафрейм для панд df, как показано ниже:

Serviceday  Proj
16-Feb-2019  0
17-Feb-2019  1
17-Feb-2019  0
17-Feb-2019  0
16-Feb-2019  0
18-Feb-2019  0

Теперь, если Proj равно 1, по крайней мере один раз для каждого уникального Serviceday, то для этого конкретного Serviceday столбец Projected в моей таблице базы данных должен быть равен 1, в противном случае 0.

Как и здесь, столбец Projected для Servicedays 16-го и 18-го должен быть 0, а для 17-го должен быть 1 в моей таблице БД. По сути, мне нужно обновить таблицу базы данных, основываясь на этом тесте, выполненном на фрейме данных pandas.

Как написать функцию, которая будет иметь цикл for для выполнения теста, а затем SQL-запрос для вставки в базу данных?

БД, которую я использую, - Oracle12c

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Предполагая только два значения, 0 и 1, рассмотрим transform:

df['Proj'] = df.groupby(['Serviceday'])['Proj'].transform('max')

df
#     Serviceday  Proj
# 0  16-Feb-2019     0
# 1  17-Feb-2019     1
# 2  17-Feb-2019     1
# 3  17-Feb-2019     1
# 4  16-Feb-2019     0
# 5  18-Feb-2019     0

Затем добавьте соответственно с to_sql, используя соединение SQLAlchemy.

df.to_sql(name='mytable', con=myengine, index = False, if_exists='append')

В качестве альтернативы с выполнением курсора с использованием списка списков из DataFrame.values():

sql = '''INSERT INTO mytable (Serviceday, Proj) VALUES (:1, :2);'''

mycur.executemany(sql, df[['Serviceday', 'Proj']].values.tolist())   
myconn.commit()
0 голосов
/ 10 июля 2019

Я думаю, вы можете сделать что-то подобное.Суммируйте столбец Proj для каждого ServiceDay.Если оно больше 0, тогда Projected = 1, иначе Projected = 0.Для записи в базу данных используйте метод данных to_sql .

df1=df.groupby('ServiceDay').Proj.agg('sum').to_frame()
df1['Projected']=(df1.Proj>0).astype('uint8')
df1.drop(['Proj'], axis=1)
df1.to_sql(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...