#python #pandas
#python #pandas
Вопрос:
У меня есть таблица фреймов данных, как показано ниже
status timeamp;status
recived [{'status':'pending','date':'21-09-2010'},{'status':'recived','date':'21-10-2011'}]
recived [{'status':'recived','date':'21-10-2011'}]
pending [{'status':'pending','date':'19-09-2009'},{'status':'recived','date':'21-10-2001'}]
recived [{'status':'pending','date':'21-09-2010'},{'status':'recived','date':'21-10-2011'}]
Я хочу найти максимальную дату в списке словарей в столбце time amp; status. Как показано ниже в виде списка.
Новый список должен иметь ['21-10-2011','21-10-2011','19-09-2009','21-10-2011']
Я попробовал приведенный ниже код для полного столбца, но это не помогло и бросило string indices must be integers
new_list=[]
for i in new['timeamp;status']:
new_list.append(max([x['date'] for x in i]))
Любая помощь очень ценится.
Ответ №1:
Сначала необходимо преобразовать значения в словари, а затем использовать ваше решение Series.apply
с преобразованием значений в datetimes:
import ast
df['timeamp;status'] = df['timeamp;status'].apply(ast.literal_eval)
f = lambda x: max(pd.to_datetime([y['date'] for y in x], format='%d-%m-%Y'))
df['new'] = df['timeamp;status'].apply(f)
print (df)
status timeamp;status new
0 recived [{'status': 'pending', 'date': '21-09-2010'}, ... 2011-10-21
1 recived [{'status': 'recived', 'date': '21-10-2011'}] 2011-10-21
2 pending [{'status': 'pending', 'date': '19-09-2009'}, ... 2009-09-19
3 recived [{'status': 'pending', 'date': '21-09-2010'}, ... 2011-10-21
Если нужен оригинальный формат:
f = lambda x: max(pd.to_datetime([y['date'] for y in x], format='%d-%m-%Y'))
df['new'] = df['timeamp;status'].apply(f).dt.strftime('%d-%m-%Y')
print (df)
status timeamp;status new
0 recived [{'status': 'pending', 'date': '21-09-2010'}, ... 21-10-2011
1 recived [{'status': 'recived', 'date': '21-10-2011'}] 21-10-2011
2 pending [{'status': 'pending', 'date': '19-09-2009'}, ... 19-09-2009
3 recived [{'status': 'pending', 'date': '21-09-2010'}, ... 21-10-2011