如何更改熊猫系列的dtype?

时间:2020-04-18 09:23:25

标签: python string pandas dataframe iteration

我正在尝试处理现代艺术博物馆的数据集,并希望将其中的一些序列转换为整数值(以供稍后计算)。我尝试使用.astype方法转换dtype,但未成功。我看到某个地方可以用与打开csv操作相同的代码行来执行此操作,因此尽管没有成功,但我尝试了。

import pandas as pd

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

df.head()


df.dtypes

TypeError跟踪(最近一次通话最近) pandas._libs.parsers.TextReader._convert_tokens()中的pandas_libs \ parsers.pyx

ValueError:以10为底的int()无效文字:'(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?

P.S,我尝试研究regex方法,但是我是python的新手,看来技术性很强

1 个答案:

答案 0 :(得分:1)

您可以使用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]:

编辑:

回答您的null_values完整问题:

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浮动,因为其中没有任何值。