Как изменить тип d серии pandas? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь работать с набором данных из Музея современного искусства и sh, чтобы преобразовать некоторые серии в целочисленные значения (для расчетов позже). Я пытался преобразовать dtype, используя метод .astype, но мне это не удалось. Я где-то видел, что вы можете сделать это в той же строке кода, что и операция open csv, поэтому я попытался сделать это, хотя и безуспешно.

import pandas as pd

df = pd.read_csv('artworks.csv', dtype ={'BeginDate': int})

df.head()


df.dtypes

TypeError Traceback (последний вызов был последним) pandas_libs \ parsers.pyx в pandas ._ libs.parsers.TextReader._convert_tokens ()

ValueError: недопустимый литерал для int () с основанием 10: '(1947)'

В конечном итоге Моя цель - преобразовать столбцы BeginDate и EndDate (которые являются типами объектов) в целые числа. В качестве альтернативы я попытался написать функцию для удаления скобок из дат, а также для преобразования дат в целые числа. Это ниже;

def date_cleaner(date):
    if date != "":

        date = date.replace("(", "")
        date = date.replace(")", "")
        date = int(date)

    return (date)

date_cleaner(1999)

Но это также вернуло ошибку, когда я запустил код. Однако, когда я привожу ('1999') в качестве аргумента, код работает как надо. Проблема заключается в том, что когда я использую функцию в серии pandas (например, во время итерации), я получаю сообщение об ошибке ниже:

for i, row in df.iterrows():
    birth_date = row[3]
    death_date = row[4]

    birth_date = date_cleaner(birth_date)
    death_date = date_cleaner(death_date)

    row[3] = birth_date
    row[4] = death_date

df.head()

AttributeError                            Traceback (most recent call last)
<ipython-input-54-dbecb2797a53> in <module>
      3     death_date = row[4]
      4 
----> 5     birth_date = date_cleaner(birth_date)
      6     death_date = date_cleaner(death_date)
      7 

<ipython-input-51-3ddccbf04d24> in date_cleaner(date)
      6     if date != "":
      7 
----> 8         date = date.replace("(", "")
      9         date = date.replace(")", "")
     10         date = int(date)

AttributeError: 'int' object has no attribute 'replace'

Что я делаю неправильно и как я может на самом деле очистить столбцы и конвертировать dtype?

PS Я пытался изучить метод регулярных выражений, но я новичок в python, и он кажется довольно техническим

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете использовать метод str.strip тогда как тип int

df['BeginDate'] = df['BeginDate'].astype(str).str.strip('()').astype(int)

Точно полный пример может прояснить это подробнее здесь:

In [10]: df = pd.DataFrame( data = [ {'BeginDate' : '(1948)' } ] )

In [11]: df
Out[11]:
  BeginDate
0    (1948)

In [12]: df['BeginDate'] = df['BeginDate'].astype(str).str.strip('()').astype(int)

In [13]: df
Out[13]:
   BeginDate
0       1948

In [14]:

Редактировать:

Ответьте на вопрос о том, как сохранить ноль_значений:

In [43]: def clean_year(begin_date):
    ...:     if not  pd.isnull(begin_date):
    ...:         return int(str(begin_date).strip('()'))
    ...:     return begin_date
    ...:

In [44]: df['BeginDate'] .apply(clean_year)
Out[44]:
0    1948.0
1       NaN
Name: BeginDate, dtype: float64

, но имейте в виду, что это заставит ваши столбцы плавать dtype, поскольку там нет значения.

...