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

时间:2018-07-26 10:25:25

标签: python pandas dictionary dataframe counting

我正在对代表分类值的整数列进行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

问题

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

3 个答案:

答案 0 :(得分:4)

这是我的解决方案:

>>> 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

答案 1 :(得分:1)

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

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不同,您不能直接传递字典,但可以传递可调用函数。
  • 直接更新索引,而不使用中间变量。

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

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

答案 2 :(得分:0)

分类数据

您可以将Categorical Datapd.CategoricalIndex.rename_categories结合使用:

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

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