我已经使用了不同的答案,但没有一个能解决我的问题。 我还看了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)在groupby
和c1
列上执行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])
答案 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')