ngu*_*sch 2 python matplotlib pandas seaborn
我创建了一个漂亮整洁的分组数据框,然后我在一个简单的seaborn条形图中使用了这些数据.但是,当我尝试向条形图添加标签时,我收到以下错误:
ValueError:无法将float NaN转换为整数
我知道这是因为其中一个分组类别只有一个值(而不是两个).如何将其标记为"0"?
我已经在这个兔子洞里走了一整天,但没有找到任何东西.以下是我尝试过的事情(以多种方式):
pd.fillna().我使用了很多经常遇到这类问题的数据,所以我真的很感激帮助解决这个问题.看起来很简单.我错过了什么?谢谢!
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# my initial data set
d = {'year' : [2014,2014,2014,2015,2015,],
'status' : ["n","y","n","n","n"],
'num' : [1,1,1,1,1]}
df = pd.DataFrame(d)
# groupby to create another dataframe
df2 = (df["status"]
.groupby(df["year"])
.value_counts(normalize=True)
.rename("Percent")
.apply(lambda x: x*100)
.reset_index())
# create my bar plot
f = plt.figure(figsize = (11,8.5))
ax1 = plt.subplot(2,2,1)
sns.barplot(x="year",
y="Percent",
hue="status",
hue_order = ["n","y"],
data=df2,
ci = None)
# label the bars
for p in ax1.patches:
ax1.text(p.get_x() + p.get_width()/2., p.get_height(), '%d%%' % round(p.get_height()),
fontsize=10, color='red', ha='center', va='bottom')
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果p.get_height()返回NaN,您可以通过将高度设置为零来处理空条的情况:
for p in ax1.patches:
height = p.get_height()
if np.isnan(height):
height = 0
ax1.text(p.get_x() + p.get_width()/2., height, '%d%%' % round(height),
fontsize=10, color='red', ha='center', va='bottom')
Run Code Online (Sandbox Code Playgroud)
给我
或者,您可以扩展框架以确保其中存在零:
non_data_cols = df2.columns.drop("Percent")
full_index = pd.MultiIndex.from_product([df[col].unique() for col in non_data_cols], names=non_data_cols)
df2 = df2.set_index(non_data_cols.tolist()).reindex(full_index).fillna(0).reset_index()
Run Code Online (Sandbox Code Playgroud)
扩展给我
In [74]: df2
Out[74]:
year status Percent
0 2014 n 66.666667
1 2014 y 33.333333
2 2015 n 100.000000
3 2015 y 0.000000
Run Code Online (Sandbox Code Playgroud)