如何在pandas dataframe中找到混合分类变量的均值?

2024-06-17 15:06:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有关于不同年龄段的人使用各种社交媒体平台的调查数据集。我想计算一下使用社交媒体应用程序的平均人数。以下是示例数据的外观:

enter image description here

以下是可复制的熊猫数据帧:

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,))})

以下是我尝试的:

^{pr2}$

但它效率不高,没有产生我想要的产量。有什么办法完成这个吗?谢谢

更新

对我来说,要做到这一点,首先在每一列中选择分类值,然后得到它的平均值,这对其他列也一样。如果我这么做,我怎么能很好地描绘它们呢?在

注意,在web1aweb1bweb1cweb1d1表示用户,2分别表示非用户。我想计算用户和非用户的平均年龄。我怎么能做到呢?有没有人给我一个可能的办法来实现这一点?谢谢!在


Tags: 数据用户sizenprandom平台媒体社交
3条回答

这可以使用groupby方法来完成:

df.groupby(['web1a', 'web1b', 'web1c', 'web1d']).mean()

使用

df.melt('age').set_index(['variable','value']).mean(level=[0,1]).unstack().plot(kind='bar')

enter image description here

您可以按“web*”列分组并计算“age”列的平均值。在

您也可以绘制条形图(颜色可以在子图中定义)。我不确定饼图在这种情况下是否有意义。在

我试着用你的data,只取以“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()

enter image description here

相关问题 更多 >