与R Factor variable中的Python pandas最接近的是什么?
答案 0 :(得分:26)
这个问题似乎是从一年前开始的,但由于它仍在开放,因此这是一个更新。 pandas引入了categorical
dtype,它与R中的factors
非常相似。请参阅此链接以获取更多信息:
http://pandas-docs.github.io/pandas-docs-travis/categorical.html
从上面的链接重新生成一个片段,显示如何在pandas中创建“factor”变量。
In [1]: s = Series(["a","b","c","a"], dtype="category")
In [2]: s
Out[2]:
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a < b < c]
答案 1 :(得分:7)
如果您正在寻找建模等,那么patsy library中的因素很多。我承认自己也在努力解决这个问题。我发现these slides很有帮助。希望我能给出一个更好的例子,但就我自己而言,这是一个很好的例子。
答案 2 :(得分:0)
如果您希望像R一样将分类变量映射到数字,Pandas实现了一个函数,可以为您提供:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.factorize.html
import pandas as pd
df = pd.read_csv('path_to_your_file')
df['new_factor'], _ = pd.factorize(df['old_categorical'], sort=True)
此函数返回枚举映射以及唯一值列表。如果您只是在进行变量分配,则必须如上所述将后者丢弃。
如果需要本地解决方案,则可以在函数内使用集合和字典的组合。这种方法在多列上使用起来比较容易一些,但是您必须注意,None,NaN等将作为此方法的类别包括在内:
def factor(var):
var_set = set(var)
var_set = {x: y for x, y in [pair for pair in zip(var_set, range(len(var_set)))]}
return [var_set[x] for x in var]
df['new_factor1'] = df['old_categorical1'].apply(factor)
df[['new_factor2', 'new_factor3']] = df[['old_categorical2', 'old_categorical3']].apply(factor)
答案 3 :(得分:-1)
C # array containing category data
V # array containing numerical data
H = np.unique(C)
mydict = {}
for h in H:
mydict[h] = V[C==h]
boxplot(mydict.values(), labels=mydict.keys())