我已将以下CSV文件输入iPython Notebook:
public = pd.read_csv("categories.csv")
public
我还导入了panda作为pd,numpy作为np,matplotlib.pyplot作为plt。存在以下数据类型(下面是一个摘要-大约有100列)
In [36]: public.dtypes
Out[37]: parks object
playgrounds object
sports object
roading object
resident int64
children int64
我想把"公园"、"Playground"、"运动"和"公路"改为类别(它们有不同的评分标准--每一列都有不同类型的评分标准(例如,一列有"强烈同意"、"同意"等,另一列有"非常重要"、"重要"等),剩下的为int64。
我能够创建一个单独的 Dataframe -public1-并使用以下代码将其中一列更改为category类型:
public1 = {'parks': public.parks}
public1 = public1['parks'].astype('category')
但是,当我尝试使用此代码立即更改一个号码时,我没有成功:
public1 = {'parks': public.parks,
'playgrounds': public.parks}
public1 = public1['parks', 'playgrounds'].astype('category')
尽管如此,我不想创建一个只包含类别列的单独数据框。我希望在原始数据框中更改它们。
我尝试了许多方法来实现这一点,然后尝试下面的代码:Change column type in pandas.
public[['parks', 'playgrounds', 'sports', 'roading']] = public[['parks', 'playgrounds', 'sports', 'roading']].astype('category')
并得到以下错误:
NotImplementedError: > 1 ndim Categorical are not supported at this time
有没有办法把"公园"、"Playground"、"运动"、"公路"改成类别(这样就可以分析利克特量表的React),而不去碰"居民"和"儿童"(以及其他94列字符串、int+浮点数)?
我使用的是Python 2.7。
8条答案
按热度按时间waxmsbnn1#
有时候,你只需要使用一个for循环:
mum43rcc2#
可以使用
pandas.DataFrame.apply
方法沿着lambda
表达式来解决这个问题。我不知道有什么方法可以就地执行此操作,所以通常我会以如下方式结束:
显然,如果您不想选择所有特定的数据类型,可以用显式列名替换
.select_dtypes
(尽管在您的示例中似乎您想要所有object
类型)。icnyk63a3#
不需要循环,Pandas现在可以直接做,只要传递一个你想要转换的列的列表,Pandas就会转换它们。
crcmnpdw4#
从panda 0.19.0开始,新增功能说明
read_csv
支持直接解析Categorical
列。这个答案仅适用于从read_csv
开始的情况,否则,我认为unutbu的答案仍然是最好的。〈0.19.0(或〉=19.0,不指定数据类型)
〉=0.19.0
对于混合
dtypes
解析,如Categorical
可以通过在read_csv
中传递字典dtype={'colname' : 'category', ...}
来实现。性能
一个轻微的加速(本地jupyter笔记本),正如发行说明中提到的。
gpfsuwkq5#
为了让事情更简单。没有应用。没有Map。没有循环。
n1bvdmb66#
使用列表解析(避免循环),这将把所有dtypes=object的列转换为dtypes=category。我用'df'作为 Dataframe ,这样更通用。
如果你出于某种原因想避免“copy=False”参数(正如python文档告诉我们在使用它时要小心),你可以使用下面这行。
这是我的第一个答案,所以请友好。
apeeds0o7#
我发现使用for循环效果很好。
s1ag04yj8#
Jupyter笔记本
在我的情况下,我有许多对象,我想把它转换为类别大Dataframe。
因此,我所做的是选择对象列并填充NA到missing的任何内容,然后将其保存在原始Dataframe中,如下所示
我希望这可能是一个有用的资源,供以后参考