如何统计多列中相同值的数量?

时间:2018-01-21 03:15:22

标签: python pandas

例如:

A B C
1 1 2
2 1 2
3 3 3
3 2 1

我想添加一个D列,代表ABC中相同数量的值。

D
2
2
3
1

2 个答案:

答案 0 :(得分:4)

选项1
您可以使用stack + groupby + value_counts

df['D'] = df.stack().groupby(level=0).value_counts().max(level=0)

df

   A  B  C  D
0  1  1  2  2
1  2  1  2  2
2  3  3  3  3
3  3  2  1  1

如果您想要具有最高模式的号码,请链接groupby + head来电 -

v = (df.stack()
       .groupby(level=0)
       .value_counts()
       .groupby(level=0)
       .head(1)
       .reset_index(level=0, drop=True)
)

1    2
2    2
3    3
1    1
dtype: int64

df['Num'], df['Num_Mode'] = v.index, v.values   # to assign it

如果多个号码具有相同的最高模式,则只返回其中一个。

选项2
另一个选项受@Wen启发,使用applypd.Series.mode -

df['D'] = df.stack().groupby(level=0).apply(lambda x: pd.Series.mode(x).max())

或者,

df['D'] = df.apply(pd.Series.mode, 1).max(1).astype(int)

df

   A  B  C  D
0  1  1  2  2
1  2  1  2  2
2  3  3  3  3
3  3  2  1  1

答案 1 :(得分:4)

scipy模式也可以返回计数

stats.mode(df.values,1)
Out[830]: 
ModeResult(mode=array([[1],
       [2],
       [3],
       [1]], dtype=int64), count=array([[2],
       [3],
       [4],
       [2]]))

更多信息:

template<class T>struct tag_t{using type=T;};
template<class Tag>using type=typename Tag::type;

template<class Q>
tag_t<Q> from_a_q(A<Q>*);

template<class X>
using a_q_r = type<decltype( from_a_q( (X*)0 ) )>;