Python Pandas - 将某些列类型更改为类别

新手上路,请多包涵

我已将以下 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

我想将“公园”、“游乐场”、“运动”和“道路”更改为类别(它们中有李克特量表反应——尽管每一列都有不同类型的李克特反应(例如,“强烈同意”、“同意” “ 等,另一个有“非常重要”、“重要”等),其余部分为 int64。

我能够创建一个单独的数据框 - public1 - 并使用以下代码将其中一列更改为类别类型:

 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

有没有办法将“公园”、“游乐场”、“运动”、“道路”更改为类别(这样就可以分析李克特量表的反应),留下“居民”和“儿童”(以及其他 94 个列) string, int + floats) 没有改变吗?

我正在使用 Python 2.7。

原文由 gincard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 869
2 个回答

有时,您只需要使用 for 循环:

 for col in ['parks', 'playgrounds', 'sports', 'roading']:
    public[col] = public[col].astype('category')

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 pandas.DataFrame.apply 方法和 lambda 表达式来解决这个问题。在您的示例中,您可以使用

df[['parks', 'playgrounds', 'sports']].apply(lambda x: x.astype('category'))

我不知道有什么方法可以就地执行此操作,所以通常我会得到这样的结果:

 df[df.select_dtypes(['object']).columns] = df.select_dtypes(['object']).apply(lambda x: x.astype('category'))

显然,如果您不想选择所有特定数据类型,则可以将 .select_dtypes 替换为显式列名(尽管在您的示例中,您似乎想要所有 object 类型)。

原文由 Derek Kaknes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题