python - 如何在熊猫数据框中找到混合分类变量的均值?
问题描述
我有关于使用各种社交媒体平台的不同年龄人群的调查数据集。我想计算使用社交媒体应用程序的平均人数。以下是示例数据的样子:
这是可重现的熊猫数据框:
df=pd.DataFrame({'age': np.random.randint(10,100,size=10),
'web1a': np.random.choice([1, 2], size=(10,)),
'web1b': np.random.choice([1, 2], size=(10,), p=[1./3, 2./3]),
'web1c': np.random.choice([1, 2], size=(10,)),
'web1d': np.random.choice([1, 2], size=(10,))})
这是我尝试过的:
df.pivot_table(df, values='web1a', index='age', aggfunc='mean')
但它效率不高,也没有产生我想要的输出。有什么想法可以完成吗?谢谢
更新:
对我来说,这样做的方法是,首先在每一列中选择分类值并获得平均值,这对其他人来说可能是相同的。如果我这样做,我怎样才能很好地绘制它们?
请注意,在 、 、 、 列中web1a
,web1b
分别表示用户和非用户。我想计算用户和非用户的平均年龄。我怎样才能做到这一点?有人给我一个可能的想法来实现这一点吗?谢谢!web1c
web1d
1
2
解决方案
您可以按“web*”列分组并计算“年龄”列的平均值。
您还可以绘制条形图(可以在子图中定义颜色)。我不确定饼图在这种情况下是否有意义。
我尝试使用您的数据,只使用以“web”开头的列。值比 '1' 和 '2' 多,所以我假设您只想分析用户和非用户,而不是其他。您可以以相同的方式更改图表中的值或添加其他值,只要您知道要绘制哪些值即可。
df = df.filter(regex=('web|age'),axis=1)
userNr = '1'
nonUserNr = '2'
users = list()
nonUsers = list()
labels = [x for x in df.columns.tolist() if 'web' in x]
for col in labels:
users.append(df.loc[:,['age',col]].groupby(col).mean().loc[userNr][0])
nonUsers.append(df.loc[:,['age',col]].groupby(col).mean().loc[nonUserNr][0])
from matplotlib import pyplot as plt
x = np.arange(1, len(labels)+1)
ax = plt.subplot(111)
ax.bar(x-0.1, users, width=0.2,color='g')
ax.bar(x+0.1,nonUsers, width=0.2,color='r')
plt.xticks(x, labels)
plt.legend(['users','non-users'])
plt.show()
推荐阅读
- c - 结构是声明或定义还是内核源代码中的某种类型的面向对象行为
- assembly - Mips 程序有无限循环,也无法弄清楚如何正确递增值?
- javascript - 合并数组内部的所有数组
- r - 如何使用 r 中的两个基于幂的八度音阶切换数据帧中的值
- java - Gradle 无法使用与 Gradle 发行版“xxbin.zip”的连接来运行分阶段构建操作,根本原因
- python - 'return' 外部函数 SyntaxError
- oracle - 创建实体化视图时出现 ORA-00600
- python - statsmodels 中的互相关图
- python - jenkins 运行 python 代码得到 ModuleNotFoundError: No module named 'selenium'
- angular - Firebase auth setPersistance({type: 'SESSION'}) throws INTERNAL ASSERTION FAILED: Expected a class definition