#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я хочу отсортировать фрейм данных по индексу столбца. Проблема в том, что мои столбцы — это ‘даты’, дд / мм / гггг, импортированные непосредственно из моего Excel. Например:
10/08/20 12/08/20 11/08/20
0 2.0 6.0 15.0
1 6.0 11.0 8.0
2 4.0 7.0 3.0
3 7.0 12.0 2.0
4 12.0 5.0 7.0
Результат, который я хочу, это:
10/08/20 11/08/20 12/08/20
0 2.0 15.0 6.0
1 6.0 8.0 11.0
2 4.0 3.0 7.0
3 7.0 2.0 12.0
4 12.0 7.0 5.0
Я использую
df.sort_index(axis=1)
Это выдает мне следующую ошибку:
Ошибка типа: ‘<‘ не поддерживается между экземплярами ‘datetime.datetime’ и ‘str’
Я хочу сделать это в фрейме данных panda. Любая помощь будет оценена. Спасибо
Комментарии:
1. Почему у двух дат в конце есть
'.'
, а у одной нет?2. Пожалуйста, игнорируйте «. » это было по ошибке. Действительно сожалею об этой путанице
3. @anmol sureka , пожалуйста, попробуйте отредактированный код. Поскольку столбцы не были в формате datetime, как вы отредактировали в своем вопросе.
Ответ №1:
Сначала удалите ‘.’ в конце даты из таблицы источника данных. для этих данных
10-08-2020 12-08-2020 11-08-2020
0 2 6 15
1 6 11 8
2 4 7 3
3 7 12 2
4 12 5 7
попробуйте это
import datetime as dt
df.columns=pd.Series(df.columns).apply(lambda d: dt.datetime(d, dt.datetime.strptime(d, '%d/%m/%Y')))
df.sort_index(axis = 1)
Ответ №2:
Первый:
df.columns = df.columns.str.replace(".", "")
Затем:
df.sort_index(axis = 1)
Обновление: как упоминал Ch3steR в комментариях. Для удаления «.»
df.columns = df.columns.str.rstrip(".")
Использование str.rstrip
для обобщения, поскольку day.month.year
это допустимый формат, использование str.replace
заменило бы каждый .
Пример:
s = pd.Series(["1.2.2020."])
pd.to_datetime(s.str.replace('.', ''))
# 0 2020-12-20 # Interpeted wrong
# dtype: datetime64[ns]
pd.to_datetime(s.str.rstrip('.'))
# 0 2020-01-02
# dtype: datetime64[ns]
Комментарии:
1. @Ch3steR КРУТО! Не знал об этой функции. Обновил ответ вашим предложением.
2. Добавлены некоторые детали, не стесняйтесь отменить изменения, если не в порядке.
Ответ №3:
Ваша ошибка связана с тем, что вы смешиваете строковые типы с типами даты. Либо все ваши имена столбцов являются строками, либо все они являются датами, но вы не можете смешивать оба.
Например
l=[[2.0, 6.0, 15.0],
[6.0, 11.0, 8.0],
[4.0, 7.0, 3.0],
[7.0, 12.0, 2.0],
[12.0, 5.0, 7.0]]
d = pd.DataFrame(l, columns =['10/08/20', '12/08/20', '11/08/20']) # column names are strings
выдает
10/08/20 12/08/20 11/08/20
0 2.0 6.0 15.0
1 6.0 11.0 8.0
2 4.0 7.0 3.0
3 7.0 12.0 2.0
4 12.0 5.0 7.0
Теперь, если я хочу выполнить сортировку по именам столбцов, я набираю
d.sort_index(axis = 1)
10/08/20 11/08/20 12/08/20
0 2.0 15.0 6.0
1 6.0 8.0 11.0
2 4.0 3.0 7.0
3 7.0 2.0 12.0
4 12.0 7.0 5.0
Если бы, с другой стороны, имена столбцов были датами, как в
from dateutil.parser import parse
d = pd.DataFrame(l, columns =[parse('10/08/20'), parse('12/08/20'), parse('11/08/20')])
у нас будет
2020-10-08 2020-12-08 2020-11-08 #now column names are dates
0 2.0 6.0 15.0
1 6.0 11.0 8.0
2 4.0 7.0 3.0
3 7.0 12.0 2.0
4 12.0 5.0 7.0
Опять же, вы можете отсортировать их, используя тот же
details.sort_index(axis = 1)
2020-10-08 2020-11-08 2020-12-08
0 2.0 15.0 6.0
1 6.0 8.0 11.0
2 4.0 3.0 7.0
3 7.0 2.0 12.0
4 12.0 7.0 5.0
и не выдаст вам ошибки.
Комментарии:
1. Привет. Спасибо за ответ. ‘.’ отсутствует в исходном листе. Он попал сюда по ошибке. Извините за это. Когда я импортирую Excel, мои даты импортируются в формате datetime.datetime, из-за чего он выдает ошибку: TypeError: ‘<‘ не поддерживается между экземплярами ‘datetime.datetime’ и ‘str’