Категорические изменения dtype после использования расплава - PullRequest
0 голосов
/ 11 октября 2018

Отвечая на на этот вопрос , я обнаружил, что после использования melt на фрейме данных pandas столбец, который был ранее упорядоченным категориальным dtype, становится object.Является ли это предполагаемым поведением?

Примечание: не ищет решения, просто задается вопросом, есть ли причина для такого поведения или не является ли это предполагаемым поведением.

Пример:

Использование следующего фрейма данных df:

  Cat  L_1  L_2  L_3
0   A    1    2    3
1   B    4    5    6
2   C    7    8    9

df['Cat'] = pd.Categorical(df['Cat'], categories = ['C','A','B'], ordered=True)

# As you can see `Cat` is a category
>>> df.dtypes
Cat    category
L_1       int64
L_2       int64
L_3       int64
dtype: object

melted = df.melt('Cat')

>>> melted
  Cat variable  value
0   A      L_1      1
1   B      L_1      4
2   C      L_1      7
3   A      L_2      2
4   B      L_2      5
5   C      L_2      8
6   A      L_3      3
7   B      L_3      6
8   C      L_3      9

Теперь, если я посмотрю на Cat, он станет объектом:

>>> melted.dtypes
Cat         object
variable    object
value        int64
dtype: object

Это предназначено?

1 Ответ

0 голосов
/ 11 октября 2018

В исходный код.0.22.0 (Моя старая версия)

 for col in id_vars:
        mdata[col] = np.tile(frame.pop(col).values, K)
     mcolumns = id_vars + var_name + [value_name]

, который вернет объект типа данных с np.tile.

Это было исправлено в 0.23.4 (После того, как я обновил мой pandas)

df.melt('Cat')
Out[6]: 
  Cat variable  value
0   A      L_1      1
1   B      L_1      4
2   C      L_1      7
3   A      L_2      2
4   B      L_2      5
5   C      L_2      8
6   A      L_3      3
7   B      L_3      6
8   C      L_3      9
df.melt('Cat').dtypes
Out[7]: 
Cat         category
variable      object
value          int64
dtype: object

Больше информации, как это исправить:

for col in id_vars:
    id_data = frame.pop(col)
    if is_extension_type(id_data): # here will return True , then become concat not np.tile
        id_data = concat([id_data] * K, ignore_index=True)
    else:
        id_data = np.tile(id_data.values, K)
    mdata[col] = id_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...