如何用最频繁的值替换熊猫列的值

时间:2019-07-09 20:43:24

标签: python pandas pandas-groupby

我已经使用了不同的答案,但没有一个能解决我的问题。 我还看了this答案。但它也不起作用。 这是我的数据框:

import numpy as np
import pandas as pd

np.random.seed(2)
col1 = np.random.choice([1,2,3], size=(50))
col2 = np.random.choice([1,2,3,4], size=(50))
col3 = np.random.choice(['a', 'b', 'c', 'd', 'e'], size=(50))
data = {'col1':col1, 'col2':col2, 'col3':col3}
df = pd.DataFrame(data)

我想

1)在groupbyc1列上执行c2

2)创建一个新列,该列是c3列上最频繁使用的值。

最终的df应该如下所示:

    c1  c2  c3  c4
0   1   1   b   b
1   1   1   b   b
2   1   2   a   b
3   1   2   b   b
4   1   2   b   b
5   1   2   b   b
6   1   2   c   b
7   1   3   a   a
8   1   3   c   a
9   1   3   b   a
10  1   3   c   a
11  1   3   a   a
12  1   3   b   a
13  1   3   a   a
14  1   3   a   a
15  1   3   c   a
16  1   4   a   a
17  2   1   c   c
18  2   1   c   c
19  2   1   a   c
20  2   1   c   c
21  2   1   c   c
22  2   1   b   c
23  2   2   a   a
24  2   2   c   a
25  2   2   a   a
26  2   3   a   a
27  2   3   a   a
28  2   4   c   c
29  2   4   c   c
30  3   1   b   a
31  3   1   a   a
32  3   1   a   a
33  3   1   c   a
34  3   1   b   a
35  3   2   c   c
36  3   2   c   c
37  3   2   b   c
38  3   2   a   c
39  3   2   c   c
40  3   3   b   b
41  3   3   a   b
42  3   3   b   b
43  3   3   c   b
44  3   3   a   b
45  3   3   b   b
46  3   3   b   b
47  3   3   c   b
48  3   4   b   b
49  3   4   c   c

例如,我使用此代码没有成功:

df1 = df.groupby(['c1', 'c2'])['c3'].agg(lambda x:x.value_counts().index[0])

3 个答案:

答案 0 :(得分:1)

您要idxmax

df['col4'] = df.groupby(['col1', 'col2']).col3.transform(lambda x: x.value_counts().idxmax())

样本数据:

np.random.seed(2)
col1 = np.random.choice([1,2,3], size=(10))
col2 = np.random.choice([1,2,3,4], size=(10))
col3 = np.random.choice(['a', 'b', 'c', 'd', 'e'], size=(10))
data = {'col1':col1, 'col2':col2, 'col3':col3}
df = pd.DataFrame(data)

给予:

   col1  col2 col3 col4
0     1     1    d    b
1     2     1    c    c
2     1     1    b    b
3     3     2    c    c
4     3     4    e    b
5     1     4    d    d
6     3     3    a    a
7     2     1    e    c
8     2     3    d    d
9     3     4    b    b

答案 1 :(得分:1)

.transform(pd.Series.mode)不起作用的原因是,当有两种模式时,它返回了一个列表。我们可以通过访问此列表中的第一个值来解决此问题:

df['c4'] = df.groupby(['c1', 'c2'])['c3'].transform(lambda x: x.mode()[0])

df['c4'] = df.groupby(['c1', 'c2'])['c3'].transform(lambda x: pd.Series.mode(x)[0])
    c1  c2 c3 c4
0    1   1  b  b
1    1   1  b  b
2    1   2  a  b
3    1   2  b  b
4    1   2  b  b
5    1   2  b  b
6    1   2  c  b
7    1   3  a  a
8    1   3  c  a
9    1   3  b  a
10   1   3  c  a
11   1   3  a  a
12   1   3  b  a
13   1   3  a  a
14   1   3  a  a
15   1   3  c  a
16   1   4  a  a
17   2   1  c  c
18   2   1  c  c
19   2   1  a  c
20   2   1  c  c
21   2   1  c  c
22   2   1  b  c
23   2   2  a  a
24   2   2  c  a
25   2   2  a  a
26   2   3  a  a
27   2   3  a  a
28   2   4  c  c
29   2   4  c  c
30   3   1  b  a
31   3   1  a  a
32   3   1  a  a
33   3   1  c  a
34   3   1  b  a
35   3   2  c  c
36   3   2  c  c
37   3   2  b  c
38   3   2  a  c
39   3   2  c  c
40   3   3  b  b
41   3   3  a  b
42   3   3  b  b
43   3   3  c  b
44   3   3  a  b
45   3   3  b  b
46   3   3  b  b
47   3   3  c  b
48   3   4  b  b
49   3   4  c  b

答案 2 :(得分:0)

您可以尝试在每个组中找到模式,然后将其合并回集合中。

modes = df.groupby(['col1', 'col2'])['col3'].apply(pd.Series.mode)
df = df.merge(modes, on=['col1', 'col2'], how='left')