[英]How to calculate percentages when total is not 100%?
我對熊貓和 matplotlib 很陌生。
我申請了一份問卷,在某個問題中,人們被問到他們使用的社交網絡。 選項包括 Facebook、Instagram、Twitter 等。 他們可以選擇的不僅僅是一個選項。
我想組織這些數據來繪制條形圖。 我使用了以下代碼:
listsocial = df["SocialNetworks"].str.split(', ', expand=True)
listsocial.head()
listsocial = 100*listsocial.stack().value_counts(normalize=True)
進而:
sns.set(font_scale=1.4)
ax = listsocial.plot(kind='bar', figsize=(15,7), color=('#009C3B'), grid=True)
ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=False))
plt.xticks(rotation=80)
plt.suptitle('Most used social networks', fontsize=20)
plt.xlabel('Social network', fontsize=14, labelpad=20)
plt.ylabel('Respondents\n(%)', fontsize=14, labelpad=20)
plt.show()
但是,結果沒有考慮到人們可以回答多個選項這一事實,因此總數應該不是 100%。 我希望圖表顯示如下數據:70% 使用 Facebook,60% 使用 Instagram,等等。
提前致謝。
在這種情況下,拆分和堆疊不是要走的路。
我會為每個感興趣的社交網絡創建單獨的列,如果它包含在字符串中(一種單熱編碼器),則分配True
social_networks = pd.DataFrame()
for sn in ['Facebook', 'Twitter', ...]:
social_networks[sn] = df['SocialNetworks'].str.contains(sn)
然后你可以得到百分比
social_networks = social_networks.mean()
您可以除以行數,而不是調用value_counts(normalize=True)
:
from matplotlib import pyplot as plt
from matplotlib import ticker as mtick
import numpy as np
import pandas as pd
import seaborn as sns
networks = np.array(['facebook', 'twitter', 'instagram', 'other'])
socnetw = [", ".join(networks[np.random.randint(0, 2, 4, dtype=bool)]) for _ in range(100)]
df = pd.DataFrame({"SocialNetworks": socnetw})
listsocial = df["SocialNetworks"].str.split(', ', expand=True)
listsocial = 100 * listsocial.stack().value_counts() / len(listsocial)
listsocial = listsocial.iloc[:-1] # remove the last row (which contains the count for 'None')
sns.set(font_scale=1.4)
ax = listsocial.plot(kind='bar', figsize=(15, 7), color=('#009C3B'), grid=True)
ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=False))
plt.xticks(rotation=80)
plt.suptitle('Most used social networks', fontsize=20)
plt.xlabel('Social network', fontsize=14, labelpad=20)
plt.ylabel('Respondents (%)', fontsize=14, labelpad=20)
plt.tight_layout()
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.