熊猫:将字符串列转换为有序类别?

Ric*_*ard 5 python pandas

我第一次和熊猫一起工作。我有一个包含调查回复的专栏,可以采用“非常同意”、“同意”、“不同意”、“非常不同意”和“两者都不是”值。

这是列的describe()和的输出value_counts()

count      4996
unique        5
top       Agree
freq       1745
dtype: object
Agree                1745
Strongly agree        926
Strongly disagree     918
Disagree              793
Neither               614
dtype: int64
Run Code Online (Sandbox Code Playgroud)

我想对这个问题与总分进行线性回归。但是,我觉得我应该先将该列转换为 Category 变量,因为它本身是有序的。这样对吗?如果是这样,我该怎么做?

我试过这个:

df.EasyToUseQuestionFactor = pd.Categorical.from_array(df.EasyToUseQuestion)
print df.EasyToUseQuestionFactor
Run Code Online (Sandbox Code Playgroud)

这会产生看起来模糊正确的输出,但似乎类别的顺序错误。有没有办法可以指定排序?我什至需要指定排序吗?

这是我现在的其余代码:

df = pd.read_csv('./data/responses.csv')
lm1 = ols('OverallScore ~ EasyToUseQuestion', data).fit()
print lm1.rsquared 
Run Code Online (Sandbox Code Playgroud)

nev*_*ves 8

现在有两种方法可以做到。您的列将更具可读性,因为它将是分类类型并且您仍然对值进行排序。

首先是我的首选:

df['grades'].astype('category')
Run Code Online (Sandbox Code Playgroud)

astype曾经接受一个categories论点,但它不再存在了。因此,如果您想对您的类别进行排序,或者想要拥有数据中不存在的额外类别,您必须使用以下解决方案。

此建议来自文档

In [26]: from pandas.api.types import CategoricalDtype
In [27]: s = pd.Series(["a", "b", "c", "a"])
In [28]: cat_type = CategoricalDtype(categories=["b", "c", "d"],
   ....:                             ordered=True)
In [29]: s_cat = s.astype(cat_type)
Run Code Online (Sandbox Code Playgroud)

额外提示:从带有df.colname.unique(). 如果您不需要订购它们,这可能就足够了。


jay*_*y s 3

是的,您应该将其转换为分类数据,这应该可以解决问题

likert_scale = {'strongly agree':2, 'agree':1, 'neither':0, 'disagree':-1, 'strongly disagree':-2}
df['categorical_data'] = df.EasyToUseQuestion.apply(lambda x: likert_scale[x])
Run Code Online (Sandbox Code Playgroud)