我正在对代表分类值的整数列进行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
我对那种非常乏味的解决方案不满意,您是否有针对这种情况的最佳实践?
答案 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)
说明
dict
和enumerate
来构造一个字典,将整数映射到天气类型列表。dict.get
与pd.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 Data与pd.CategoricalIndex.rename_categories
结合使用:
s = df['weather'].value_counts()
s.index = pd.Categorical(s.index).rename_categories(weather_correspondance_dict)
该功能在Pandas v0.21 +中可用。