Я хотел бы создать столбец в dataFrame, который будет результатом двух других
. В приведенном ниже примере были созданы два dataFrames: df1 и df2.
Затем третийБыл создан dataFrame, который является соединением первых двух.В этом df3 столбец «Даты» был изменен на тип dateTime.
После этого был создан столбец «DateMonth», месяц которого был извлечен из столбца «Даты».
import pandas as pd
import numpy as np
from datetime import datetime
# df1 and df2:
id_sales = [1, 2, 3, 4, 5, 6]
col_names = ['Id', 'parrotId', 'Dates']
df1 = pd.DataFrame(columns = col_names)
df1.Id = id_sales
df1.parrotId = [1, 2, 3, 1, 2, 3]
df1.Dates = ['1900-01-01', '2012-08-20', '1900-01-01', '1900-01-01', '2016-02-21', '2012-08-21']
col_names2 = ['parrotId', 'months']
df2 = pd.DataFrame(columns = col_names2)
df2.parrotId = [1, 2, 3]
df2.months = [('Mar,Jun,Sept,Dec'), ('Mar,Jun,Sept,Dec'), ('Mar,Jun,Sept,Dec')]
df3 = pd.merge(df1, df2, on = 'parrotId')
df3.Dates = pd.to_datetime(df3['Dates'], format = "%Y-%m-%d")
С помощью пользователя Lukas была создана следующая функция
def matched(row):
if type(row['months'])==str:
# for the case ('Feb, Mar, Apr') - get numerical representation of month from your string and return True if the 'Dates' value matches with some list item
return row['Dates'].month in [datetime.strptime(mon.strip()[:3], '%b').month for mon in row['months'].split(',')]
else:
# for numbers - return True if months match
return row['Dates'].month==row['months']
Применение:
df3['DateMonth'] = df3.apply(matched, axis=1).astype(int)
В примере выше у меня не было проблем.Но при репликации в моем наборе данных я получил следующее сообщение об ошибке:
ValueError: ('остаются не преобразованные данные: t', 'произошло с индексом 16772')
СтолбецДаты имеют тип Имя: Дата, тип: datetime64 [нс]
Индекс 16772:
months Mar,Jun,Sept,Dec
Dates 2015-07-31 00:00:00
Индекс 16771:
months Jan,Apr,Jul,Oct
Dates 2013-01-01 00:00:00
Уникальные значения:
array([0, 'Jan,Apr,Jul,Oct', 'Feb,May,Aug,Nov', 'Mar,Jun,Sept,Dec'],
dtype=object)
Как решить эту ошибку?