我已将以下CSV文件输入iPython Notebook:
public = pd.read_csv("categories.csv")
public
我还导入了pandas作为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
我希望将'parks'、'playgrounds'、'sports'和'roading'更改为类别(它们具有Likert量表响应 - 每列有不同类型的Likert响应,例如一个有"强烈同意"、"同意"等,另一个有"非常重要"、"重要"等),其余保留为int64。
我已经创建了一个单独的数据帧 - public1 - 并使用以下代码将其中一列更改为类别类型:
public1 = {'parks': public.parks}
public1 = public1['parks'].astype('category')
然而,当我试图使用这段代码一次性更改多个数字时,我未能成功:
public1 = {'parks': public.parks,
'playgrounds': public.parks}
public1 = public1['parks', 'playgrounds'].astype('category')
尽管如此,我不想创建一个只包含类别列的单独数据框。我希望它们在原始数据框中被更改。
我尝试了许多方法来实现这一点,然后尝试了这里的代码:Pandas中更改列类型。
public[['parks', 'playgrounds', 'sports', 'roading']] = public[['parks', 'playgrounds', 'sports', 'roading']].astype('category')
并收到以下错误信息:
NotImplementedError: > 1 ndim Categorical are not supported at this time
有没有一种方法可以将“公园”、“游乐场”、“运动”和“道路”更改为类别(以便随后可以分析Likert比例响应),同时保留“居民”和“孩子”(以及其他94个字符串、整数和浮点数列)不变?
我正在使用Python 2.7。
public
是另一个 DataFrame 的子数据集并且其中的数据是从该其他 DataFrame 中复制过来的,则可能会出现UserWarning
。为了保险起见,Pandas发出UserWarning
警告您修改public
不会修改其他DataFrame。如果修改其他DataFrame不是您想要做的或者不是问题,那么可以忽略此警告。如果您希望消除 UserWarning,请在进行形如public[col] = ...
的赋值之前插入public.is_copy = False
。 - unutbupublic.copy()
也可以用,但需要注意的是如果public
是一个大型 DataFrame,那么public.copy()
将比设置标志public.is_copy = False
的速度要慢得多。(此外,当public
是复制品时才涉及到 UserWarning,因此我们需要再制作另一个副本来消除警告,似乎有些讽刺。)另一方面,我认为public.is_copy = False
没有被记录在文档中,我是通过阅读源代码找到的。所以,如果坚持使用文档API是一项优先考虑的任务,你可能希望使用public = public.copy()
。 - unutbudf[sel_cols] = df[sel_cols].astype(new_type)
); 还有你的昵称中有一个错别字;) - mirekphd