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

时间:2014-09-19 16:35:01

标签: 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

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

我试过这个:

df.EasyToUseQuestionFactor = pd.Categorical.from_array(df.EasyToUseQuestion)
print df.EasyToUseQuestionFactor

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

这是我现在剩下的代码:

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

3 个答案:

答案 0 :(得分:1)

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

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])

答案 1 :(得分:1)

如今有两种方法可以做到这一点。您的列将更具可读性,因为它将是“分类类型”,您仍然可以对值进行排序。

首先是我的首选:

var dictionary = {"Cmaj7": [60,64,67,71]},
    getKey = (obj,val) => Object.keys(obj).find(key => obj[key].length === val.length && obj[key].every((kn) => val.includes(kn)));

console.log(getKey(dictionary,[60,64,71,67]));

额外提示:使用df['grades'].astype('category', categories = ['E', 'D', 'C', 'B', 'A'], ordered=True) 从一列中获取所有现有值。如果您不需要订购它们,这可能就足够了。

您也有docs

的建议
df.colname.unique()

答案 2 :(得分:0)

pandas.factorize() 可以获得数组的数值表示。

factorize 既可用作顶级函数 pandas.factorize(),也可用作方法 Series.factorize()Index.factorize()

import pandas as pd


df = pd.DataFrame({'answer' : ['strongly agree', 'strongly agree', 'agree', 'neither', 'disagree', 'strongly disagree']})

# df['category'] = pd.factorize(df['answer'])[0]
df['category'] = df['answer'].factorize()[0]
# print(df)

              answer  category
0     strongly agree            0
1     strongly agree            0
2              agree            1
3            neither            2
4           disagree            3
5  strongly disagree            4