例如:
A B C
1 1 2
2 1 2
3 3 3
3 2 1
我想添加一个D
列,代表A
,B
和C
中相同数量的值。
D
2
2
3
1
答案 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启发,使用apply
和pd.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 ) )>;