更改 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
对 分类 变量使用 Series.cat.rename_categories
。
对非分类变量使用Series.map
。
如果需要 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
此选项速度较慢,但通过 regex
和 method
参数提供 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.replace
和 regex=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'
}
)
我想知道是否有任何方法可以更改 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
对 分类 变量使用
Series.cat.rename_categories
。对非分类变量使用
Series.map
。如果需要 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
此选项速度较慢,但通过 regex
和 method
参数提供 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.replace
和 regex=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'
}
)