所以我使用 Pandas 创建一个数据框,其中包含一些类型为 bool、int64 和日期时间的列。对于较小的数据集,数据类型保留,但对于较大的数据集,pandas 将所有这些转换为对象。有人知道为什么要这样做以及如果那样的话我如何显式设置类型吗?
读取 CSV:
twitterDataFrame = pandas.read_csv(DataSetLocation)
twitterDataFrame['CreatedAt'] = twitterDataFrame['CreatedAt'].map(lambda x: pandas.to_datetime(x,dayfirst=True))
twitterDataFrame['CreatedAtForCalculations'] = twitterDataFrame['CreatedAt']
twitterDataFrame['InReplyToStatusID'] = twitterDataFrame['InReplyToStatusID'].map(lambda x: True if pandas.notnull(x) else False)
twitterDataFrame['InReplyToUserID'] = twitterDataFrame['InReplyToUserID'].map(lambda x: True if pandas.notnull(x) else False)
twitterDataFrame['RetweetCount'] = twitterDataFrame['RetweetCount'].map(lambda x: x if pandas.notnull(x) else 0)
twitterDataFrame['FavouriteCount'] = twitterDataFrame['FavouriteCount'].map(lambda x: x if pandas.notnull(x) else 0)
twitterDataFrame['Hashtags'] = twitterDataFrame['Hashtags'].map(lambda x: True if pandas.notnull(x) else False)
twitterDataFrame['URL'] = twitterDataFrame['URL'].map(lambda x: True if pandas.notnull(x) else False)
twitterDataFrame['MediaURL'] = twitterDataFrame['MediaURL'].map(lambda x: True if pandas.notnull(x) else False)
twitterDataFrame['MediaType'] = twitterDataFrame['MediaType'].map(lambda x: x if pandas.notnull(x) else False)
twitterDataFrame['UserMentionID'] = twitterDataFrame['UserMentionID'].map(lambda x: True if pandas.notnull(x) else False)
twitterDataFrame['PossiblySensitive'] = twitterDataFrame['PossiblySensitive'].map(lambda x: x if pandas.notnull(x) else 'NoData')
当我打印信息时,这就是我得到的。
None
<class 'pandas.core.frame.DataFrame'>
Int64Index: 21836 entries, 0 to 21835
Data columns (total 17 columns):
CreatedAt 21836 non-null object
ActualTweet 21836 non-null object
InReplyToStatusID 21836 non-null bool
InReplyToUserID 21836 non-null bool
UserID 21836 non-null object
RetweetCount 21836 non-null object
FavouriteCount 21836 non-null object
Hashtags 21836 non-null bool
URL 21836 non-null bool
MediaURL 21836 non-null bool
MediaType 21836 non-null object
UserMentionID 21836 non-null bool
PossiblySensitive 21836 non-null object
Language 21836 non-null object
Classifier 21836 non-null object
TweetLength 21836 non-null object
CreatedAtForCalculations 21836 non-null object
dtypes: bool(6), object(11)None
对于较小的数据集,但是这可以正常工作,我们得到:
None
<class 'pandas.core.frame.DataFrame'>
Int64Index: 8978 entries, 0 to 8977
Data columns (total 17 columns):
CreatedAt 8978 non-null datetime64[ns]
ActualTweet 8978 non-null object
InReplyToStatusID 8978 non-null bool
InReplyToUserID 8978 non-null bool
UserID 8978 non-null int64
RetweetCount 8978 non-null int64
FavouriteCount 8978 non-null int64
Hashtags 8978 non-null bool
URL 8978 non-null bool
MediaURL 8978 non-null bool
MediaType 8978 non-null object
UserMentionID 8978 non-null bool
PossiblySensitive 8978 non-null object
Language 8978 non-null object
Trustworthy 8978 non-null int64
TweetLength 8978 non-null int64
CreatedAtForCalculations 8978 non-null datetime64[ns]
dtypes: bool(6), datetime64[ns](2), int64(5), object(4)None
有人知道这是为什么以及我能做些什么来解决它吗?
最佳答案
这是一种将现有框架的列从对象
转换为更有用的东西的好方法。通常您不需要这样做,因为 read_csv
之类的东西会为您进行转换。但如果您有混合值,那么这些转换可能会失败。
查看文档 here
In [13]: data = """21-01-2014,1
....: 31x01x2014,foo
....: 01-01-2014,2
....: hello,3"""
In [14]: df = pd.DataFrame.from_csv( StringIO(data), index_col=None, header=None )
In [15]: df
Out[15]:
0 1
0 21-01-2014 1
1 31x01x2014 foo
2 01-01-2014 2
3 hello 3
In [16]: df.dtypes
Out[16]:
0 object
1 object
dtype: object
In [17]: df.convert_objects(convert_dates='coerce',convert_numeric=True)
Out[17]:
0 1
0 2014-01-21 1
1 NaT NaN
2 2014-01-01 2
3 NaT 3
In [18]: df.convert_objects(convert_dates='coerce',convert_numeric=True).dtypes
Out[18]:
0 datetime64[ns]
1 float64
dtype: object
这将转换“看起来”像日期时间和数字的列。您可能希望将其限制为某些列并更具选择性。它只会尝试 object
类型列。此外,这是在 cython 中实现的,所以速度会相当快。
关于python - Pandas 将列转换为不同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24912880/