pandas 我如何计算有多少用户在一次调查中给出了一个、两个、三个或四个答案?

enyaitl3  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(140)

我有这个调查数据集,我想指出用户的偏好。数据集看起来像这样:

User      Men     Women     Non-bi     Asexual 

1         Men     Women     
2         Men 
3                 Women     Non-bi 
4                                      Asexual

我希望能够统计出有多少用户喜欢男性、女性、非双性恋或两者的组合。在python中有没有简单的方法来统计这些数据并给予统计数据?
一个想法是将所有答案转换为一个列表或一列,然后我可以计算不同组合的示例。

8cdiaqws

8cdiaqws1#

您可以用途:

target = ['Men', 'Women', 'Non-bi']

# get rid of non relevant column
tmp = df.drop(columns='User').notna()

# keep users having at least one target
m1 = tmp[target].any(axis=1)
# drop rows having another match
m2 = ~tmp.drop(columns=target).any(axis=1)

# count
count = (m1&m2).sum()

输出:3

b91juud3

b91juud32#

如果需要计算所有答案的组合,将行转换为frozenset s,删除缺失值并使用Series.value_counts

s = df.set_index('User').apply(lambda x: frozenset(x.dropna()), axis=1).value_counts()
print (s)
(Asexual)          1
(Women, Non-bi)    1
(Men)              1
(Women, Men)       1
dtype: int64

或者通过DataFrame.stack进行整形,并转换为frozenset s:

s = df.set_index('User').stack().groupby('User').agg(frozenset).value_counts()
print (s)
(Asexual)          1
(Women, Non-bi)    1
(Men)              1
(Women, Men)       1
Name: value, dtype: int64

或者,如果需要通过列表匹配值-每行只计数一次,使用DataFrame.isin,通过Series.any至少生成一个True,并通过sum计数布尔值:

need = ['Men', 'Women', 'Non-bi']

out = df.isin(need).any(axis=1).sum()
print (out)
3
need = ['Men', 'Women', 'Non-bi']

out = df.reindex(need, axis=1).isin(need).any(axis=1).sum()
print (out)
3

相关问题