给定如下 Dataframe :
id column1 column2 column3 column4 columns5
1 a b a b x
2 b a c b y
3 c b a c x
考虑到这些群体:
group_1 = [a,b,c]
group_2 = [x,y,z]
如何获得此输出:
%_a %_b %_c %_x %_y %_z
0.3333 0.4167 0.25 0.667 0.333 0
因为:
% of elements of group_1: a=4/12, b=5/12, c=3/12
% of elements of group_2: x=2/3, y=1/3, z=0
4条答案
按热度按时间ki1q1bka1#
下面是
df.stack
的一种方法:df.stack
将df
转换为pd.Series
。Series.isin
),并将normalize
参数设置为True
,将Series.value_counts
应用于此选择。Series.reindex
以重新添加组中未出现在选择中的任何值(即group_1
中的z
);我们通过使用Series.fillna
为任何这样的缺失值提供值0
。pd.concat
的输入以返回一个Series
。Series
转换为df
(Series.to_frame
),将其转置(df.T
),并向列添加前缀(df.add_prefix
)。xnifntxz2#
您可以为此使用布尔掩码。例如:
将为您提供一个布尔掩码,其中列表
group_1
中DataFrame的值为True,其余为False。然后计算为True的值的数量就像使用.sum()
方法两次或.values.sum()
一样简单(即转换为numpy数组,然后对真值求和)。以同样的方式,您可以迭代通过组的元素,并使用布尔掩码来过滤单个值,例如。
对于解决方案,我将把组放在字典中,然后遍历字典:
6tdlim6h3#
下面是关于
melt
和value_counts
的命题:输出:
093gszye4#
如果
group_1
和group_2
的元素不能在同一列中共存,可能的解决方案是,基于numpy
:输出:
如果要求输出为 Dataframe :
输出: