更改 pandas 数据框中的类别名称

Changing category names in a pandas data frame

我想知道是否有任何方法可以更改 pandas 数据框中的类别名称,我尝试使用 labels.rename_categories({'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4', 'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'}) 但不幸的是没有用。

这是 pandas 数据框当前的样子

                              File  Label
20936  eight/b63fea9e_nohash_1.wav  eight
21016  eight/f44f440f_nohash_2.wav  eight
7423   three/d8ed3745_nohash_0.wav  three
1103    zero/ad63d93c_nohash_4.wav   zero
13399   five/5b09db89_nohash_0.wav   five
...                            ...    ...
13142   five/1a892463_nohash_0.wav   five
21176  eight/810c99be_nohash_0.wav  eight
16908  seven/6d818f6c_nohash_0.wav  seven
15308    six/2bfe70ef_nohash_1.wav    six
646     zero/24632875_nohash_0.wav   zero

[23666 rows x 2 columns]

TL;DR

  1. 分类 变量使用 Series.cat.rename_categories

  2. 非分类变量使用Series.map

  3. 如果需要 regex,请使用 Series.replace


1。 Series.cat.rename_categories

此选项最快,但需要 Categorical dtype. If you're analyzing categorical variables, this is highly recommended for its speed/memory/semantic benefits

首先转换为 Categorical(如果尚未转换):

df['Label'] = df['Label'].astype('category')

然后通过Series.cat.rename_categories重命名:

df['Label'] = df['Label'].cat.rename_categories({'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9})

#                               File Label
# 20936  eight/b63fea9e_nohash_1.wav     8
# 21016  eight/f44f440f_nohash_2.wav     8
# 7423   three/d8ed3745_nohash_0.wav     3
# ...                            ...   ...
# 646     zero/24632875_nohash_0.wav     0

2。 Series.map

如果您不能(或不想)使用 Categorical dtype,Series.map 是第二快的:

df['Label'] = df['Label'].map({'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9})

#                               File Label
# 20936  eight/b63fea9e_nohash_1.wav     8
# 21016  eight/f44f440f_nohash_2.wav     8
# 7423   three/d8ed3745_nohash_0.wav     3
# ...                            ...   ...
# 646     zero/24632875_nohash_0.wav     0

3。 Series.replace

此选项速度较慢,但​​通过 regexmethod 参数提供 regex/filling 功能。

作为一个人为的例子,假设我们想要更细粒度的标签:

mapping = {
    r'zero|one': '0,1',
    r'two|three': '2,3',
    r'four|five': '4,5',
    r'six|seven': '6,7',
    r'eight|nine': '8,9',
}

然后我们可以使用 Series.replaceregex=True:

df['Label'] = df['Label'].replace(mapping, regex=True)

#                               File Label
# 20936  eight/b63fea9e_nohash_1.wav   8,9
# 7423   three/d8ed3745_nohash_0.wav   2,3
# 1103    zero/ad63d93c_nohash_4.wav   0,1
# ...                            ...   ...
# 646     zero/24632875_nohash_0.wav   0,1

试试这个


label_dict = {'zero': 0,
        'one' : 1,
        'two': 2,
        'three' : 3,
        'four': 4,
        'five': 5,
        'six' : 6,
        'seven' : 7,
        'eight' : 8,
        'nine' : 9,
        }
df['Label'] = df['Label'].apply( lambda x : label_dict[x])

您可以将 .replace() 与字典一起用作 to_replace 参数。

这是文档

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html

通过更改类别名称,您的意思是用字典替换值。我说得对吗?

试试看:

df = df["label"].replace({
    'zero': '0', 
    'one': '1', 
    'two': '2', 
    'three': '3', 
    'four': '4', 
    'five': '5', 
    'six': '6', 
    'seven': '7', 
    'eight': '8', 
    'nine': '9'
  }
)