pandas从分解数据帧中获取字符串标签

时间:2017-02-13 18:47:05

标签: python pandas factorization

我将我的pandas数据帧列分解,但覆盖了原始列值。

有没有办法让原始的映射值回来参考?

示例:

df_test = pd.DataFrame({'col1': pd.Series(['cat','dog','cat','mouse'])})
df_test['col1'] = pd.factorize(df_test['col1'])[0]
df_test

enter image description here

但是我希望能够再次调用下面的内容来检查整数映射到的内容。有没有办法在不重新初始化数据帧的情况下检查映射?

pd.factorize(df_test)[1]

1 个答案:

答案 0 :(得分:1)

我建议您使用稍微不同的方法 - 使用categorical dtype

In [40]: df_test['col1'] = df_test['col1'].astype('category')

In [41]: df_test
Out[41]:
    col1
0    cat
1    dog
2    cat
3  mouse

In [42]: df_test.dtypes
Out[42]:
col1    category
dtype: object

如果你需要数字:

In [44]: df_test['col1'].cat.codes
Out[44]:
0    0
1    1
2    0
3    2
dtype: int8

400K DataFrame的内存使用情况:

In [74]: df_test = pd.DataFrame({'col1': pd.Series(['cat','dog','cat','mouse'])})

In [75]: df_test = pd.concat([df_test] * 10**5, ignore_index=True)

In [76]: df_test.shape
Out[76]: (400000, 1)

In [77]: d1 = df_test.copy()

In [78]: d2 = df_test.copy()

In [79]: d1.col1 = pd.factorize(d1.col1)[0]

In [80]: d2.col1 = d2.col1.astype('category')

In [81]: df_test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400000 entries, 0 to 399999
Data columns (total 1 columns):
col1    400000 non-null object
dtypes: object(1)
memory usage: 3.1+ MB

In [82]: d1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400000 entries, 0 to 399999
Data columns (total 1 columns):
col1    400000 non-null int64
dtypes: int64(1)
memory usage: 3.1 MB

In [83]: d2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400000 entries, 0 to 399999
Data columns (total 1 columns):
col1    400000 non-null category
dtypes: category(1)
memory usage: 390.7 KB           # categorical column takes almost 8x times less memory