Что является ближайшим эквивалентом переменной R Factor в Python pandas?
Ближайший эквивалент факторной переменной в Python Pandas
Ответ 1
Этот вопрос, кажется, с года назад, но поскольку он по-прежнему открыт здесь для обновления. pandas ввел categorical
dtype и работает очень похоже на factors
в R. Для получения дополнительной информации см. эту ссылку:
http://pandas-docs.github.io/pandas-docs-travis/categorical.html
Воспроизведение фрагмента из ссылки выше, показывающей, как создать переменную "factor" в pandas.
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]
Ответ 2
Если вы хотите сделать моделирование и т.д., много положительных эффектов для фактора в patsy library. Я признаюсь, что сам боролся с этим. Я нашел эти слайды полезными. Жаль, что я мог бы привести лучший пример, но это до тех пор, пока я сам не стал.
Ответ 3
Если вы хотите отобразить категориальную переменную на число, как это делает 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)
Ответ 4
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())