如何使用对应字典重命名 pd.value_counts() 索引

How rename pd.value_counts() index with a correspondance dictionary

我正在对表示分类值的一列整数执行 value_counts()

我有一个将数字映射到与类别名称相对应的字符串的字典。

我想找到最好的 方法来获得具有相应名称的索引。因为我对我的 4 行解决方案不满意。

我目前的解决方案

df = pd.DataFrame({"weather": [1,2,1,3]})
df
>>>
   weather
0        1
1        2
2        1
3        3

weather_correspondance_dict = {1:"sunny", 2:"rainy", 3:"cloudy"}

现在我是如何解决问题的:

df_vc = df.weather.value_counts()
index = df_vc.index.map(lambda x: weather_correspondance_dict[x] )
df_vc.index = index
df_vc
>>>
sunny     2
cloudy    1
rainy     1
dtype: int64

问题

我对那个非常乏味的解决方案不满意,你有针对这种情况的最佳实践吗?

这是一个更简单的解决方案:

weathers = ['sunny', 'rainy', 'cloudy']
weathers_dict = dict(enumerate(weathers, 1))

df_vc = df['weather'].value_counts()
df_vc.index = df_vc.index.map(weathers_dict.get)

说明

  • 使用 dictenumerate 构建一个将整数映射到天气类型列表的字典。
  • dict.getpd.Index.map 结合使用。与 pd.Series.apply 不同,您不能直接传递字典,但可以传递一个可调用函数。
  • 直接更新索引而不是使用中间变量。

或者,您可以在使用 pd.Series.value_counts 之前将地图应用到 weather。这样,您就不需要更新结果的索引。

df['weather'] = df['weather'].map(weathers_dict)
df_vc = df['weather'].value_counts()

这是我的解决方案:

>>> weather_correspondance_dict = {1:"sunny", 2:"rainy", 3:"cloudy"}
>>> df["weather"].value_counts().rename(index=weather_correspondance_dict)
    sunny     2
    cloudy    1
    rainy     1
    Name: weather, dtype: int64

分类数据

您可以使用 Categorical Data with pd.CategoricalIndex.rename_categories:

s = df['weather'].value_counts()
s.index = pd.Categorical(s.index).rename_categories(weather_correspondance_dict)

此功能在 Pandas v0.21+ 中可用。