我正在尝试处理现代艺术博物馆的数据集,并希望将其中的一些序列转换为整数值(以供稍后计算)。我尝试使用.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的新手,看来技术性很强
答案 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浮动,因为其中没有任何值。