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

2024-05-19 21:14:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我已将以下CSV文件馈送到iPython笔记本:

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

我想把‘公园’、‘操场’、‘运动’和‘道路’改成不同的类别(它们有likert量表反应——每个栏目都有不同类型的likert反应(例如,一个栏目有“强烈同意”、“同意”等,另一个栏目有“非常重要”、“重要”等),剩下的如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')

尽管如此,我不想创建只包含categories列的单独数据框。我希望在原始数据框中更改它们。

我尝试了很多方法来实现这一点,然后在这里尝试了代码:Pandas: change data type of columns。。。

public[['parks', 'playgrounds', 'sports', 'roading']] = public[['parks', 'playgrounds', 'sports', 'roading']].astype('category')

并得到以下错误:

 NotImplementedError: > 1 ndim Categorical are not supported at this time

有没有办法把“公园”、“游乐场”、“运动”、“道路”改为类别(这样就可以分析利克特量表的反应),而不去碰“居民”和“儿童”(以及其他94个字符串、int+float列)?或者,有没有更好的方法?如果有人有任何建议和/或反馈,我将非常感激…我正在慢慢地秃头扯我的头发!

多谢提前。

编辑添加-我正在使用Python2.7。


Tags: csv代码objectpublicpdcategoriescategorysports
3条回答

您可以使用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类型)。

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

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

不需要循环,Pandas现在可以直接执行,只需传递一个要转换的列列表,Pandas就会将它们全部转换。

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

df = pd.DataFrame({'a': ['a', 'b', 'c'], 'b': ['c', 'd', 'e']})

>>     a  b
>>  0  a  c
>>  1  b  d
>>  2  c  e

df.dtypes
>> a    object
>> b    object
>> dtype: object

df[df.columns] = df[df.columns].astype('category')
df.dtypes
>> a    category
>> b    category
>> dtype: object

相关问题 更多 >