Получение «ValueError: столбцы должны быть той же длины, что и ключ» при разделении столбца даты на «/»

Я попытался разбить столбец даты на 3 отдельных столбца.

df[['date1', 'date2', 'date3']] = df['Date'].str.split('/')

Вот ошибка, которую я получаю

ValueError: Columns must be same length as key

Он отлично работает, когда я просто набираю df['Date'].str.split('/') и могу подтвердить, что в каждом списке есть только 3 элемента.

Я думаю, что это может быть связано с тем, что некоторые даты не имеют полного года, поэтому длина столбца варьируется, но я не уверен, почему это имеет значение здесь.

df['Date'].value_counts()

22/05/2022    10
26/12/05      10
26/12/08      10
11/05/14      10
12/05/2019    10
              ..
28/02/05       1
14/09/2015     1
27/09/2015     1
28/09/2015     1
17/08/2015     1

df['Date'].str.len().value_counts()

8.0     4850
10.0    2280
Name: Date, dtype: int64
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ошибка вызвана тем, что не все даты в столбце «Дата» имеют одинаковую длину.

В первом формате 22.05.2022 длина 8 символов, а во втором формате 26.12.05 длина всего 6 символов.

Решением было бы сначала преобразовать все даты в одинаковую длину:

def convert_date(date):
    if len(date) == 8:
        date = "20" + date[-2:] + "/" + date[:2] + "/" + date[3:5]
return date

df['Date'] = df['Date'].apply(convert_date)

Затем вы можете разделить даты на отдельные столбцы, используя:

df[['date1', 'date2', 'date3']] = df['Date'].str.split('/')
Ответ принят как подходящий

По умолчанию Series.str.split возвращает серию (то есть один «столбец») со списками, содержащими элементы разделения).

df['Date'].str.split('/')

0    [22, 05, 2022]
1      [26, 12, 05]
2      [26, 12, 08]
3     [11, 5, 2014]
4     [12, 5, 2019]
5      [28, 02, 05]
6    [14, 09, 2015]
7    [27, 09, 2015]
8    [28, 09, 2015]
9    [17, 08, 2015]
Name: Date, dtype: object

Итак, ошибка, которую вы получаете, является результатом попытки назначить этот единственный «столбец» трем новым столбцам. Чтобы это исправить, вам нужно установить параметр expand на True. Это расширит результат на три разных столбца, которые мы затем можем назначить по назначению:

df[['date1', 'date2', 'date3']] = df['Date'].str.split('/', expand=True)

df

         Date  Count date1 date2 date3
0  22/05/2022     10    22    05  2022
1    26/12/05     10    26    12    05
2    26/12/08     10    26    12    08
3   11/5/2014     10    11     5  2014
4   12/5/2019     10    12     5  2019
5    28/02/05      1    28    02    05
6  14/09/2015      1    14    09  2015
7  27/09/2015      1    27    09  2015
8  28/09/2015      1    28    09  2015
9  17/08/2015      1    17    08  2015

Используемые данные

import pandas as pd

data = {'Date': {0: '22/05/2022', 1: '26/12/05', 2: '26/12/08', 3: '11/5/2014', 
                 4: '12/5/2019', 5: '28/02/05', 6: '14/09/2015', 7: '27/09/2015', 
                 8: '28/09/2015', 9: '17/08/2015'}, 
        'Count': {0: 10, 1: 10, 2: 10, 3: 10, 4: 10, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}}

df = pd.DataFrame(data)

Между прочим, в то время как вышеприведенное должно заставить работать назначение, если вы уверены, что логика строк даты всегда: день / месяц / год (несмотря на различия в форматировании), вероятно, лучше полагаться на pd .to_datetime с параметром dayfirst, установленным на True, а затем использовать Series.dt.day и то же самое для month и year:

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

df['day'] = df['Date'].dt.day
df['month'] = df['Date'].dt.month
df['year'] = df['Date'].dt.year

df

        Date  Count  day  month  year
0 2022-05-22     10   22      5  2022
1 2005-12-26     10   26     12  2005
2 2008-12-26     10   26     12  2008
3 2014-05-11     10   11      5  2014
4 2019-05-12     10   12      5  2019
5 2005-02-28      1   28      2  2005
6 2015-09-14      1   14      9  2015
7 2015-09-27      1   27      9  2015
8 2015-09-28      1   28      9  2015
9 2015-08-17      1   17      8  2015

Обратите внимание, что таким образом вы получите правильные и согласованные значения int.

Другие вопросы по теме