2017-09-14 35 views
1

最近我问了一个question,但现在我遇到了一个新问题。这是我的数据框:在两个值之间进行选择并设置最常见的熊猫数据帧

df = pd.DataFrame({'id':[1,1,1,1,2,2,2,3,3,3,4,4], 
       'sex': [0,0,0,1,0,0,0,1,1,0,1,1]}) 

    id sex 
0 1 0 
1 1 0 
2 1 0 
3 1 1 
4 2 0 
5 2 0 
6 2 0 
7 3 1 
8 3 1 
9 3 0 
10 4 1 
11 4 1 

现在我需要为混合性别值设置id的性价值。它应该是最常见的价值。所以,我想是这样的:

id sex 
0 1 0 
1 1 0 
2 1 0 
3 1 0 
4 2 0 
5 2 0 
6 2 0 
7 3 1 
8 3 1 
9 3 1 
10 4 1 
11 4 1 

此后,我想只有一个ID - 性别对:

id sex 
0 1 0 
1 2 0 
2 3 1 
3 4 1 

回答

1

您也可以使用np.bincount

In [179]: df.groupby('id')['sex'].apply(lambda x: np.argmax(np.bincount(x))).reset_index() 
Out[179]: 
    id sex 
0 1 0 
1 2 0 
2 3 1 
3 4 1 

时序

In [194]: df = pd.concat([df]*1000, ignore_index=True) 

In [195]: df.shape 
Out[195]: (12000, 2) 

In [196]: %timeit df.groupby('id')['sex'].apply(lambda x: np.argmax(np.bincount(x))).reset_index() 
100 loops, best of 3: 2.48 ms per loop 

In [197]: %timeit df.groupby('id')['sex'].apply(lambda x: x.value_counts().index[0]).reset_index() 
100 loops, best of 3: 4.55 ms per loop 

In [198]: %timeit df.set_index('id').groupby(level=0).sex.apply(lambda x: x.value_counts().idxmax()).reset_index() 
100 loops, best of 3: 6.71 ms per loop 
+0

我想过使用这个......但我没有做对,所以放弃了。感谢您向我展示正确的方式。 –

+0

也谢谢! – Renton

+0

定时中的唯一组的数量是多少? – jezrael

1

选项1
可以使用groupby其次value_countsidxmax

df = df.set_index('id').groupby(level=0).sex\ 
      .apply(lambda x: x.value_counts().idxmax()).reset_index() 
df 

    id sex 
0 1 0 
1 2 0 
2 3 1 
3 4 1 

选项2
类似于选项1,但在2个步骤,使用drop_duplicates

df.sex = df.groupby('id').sex.transform(lambda x: x.value_counts().idxmax()) 
df 

    id sex 
0 1 0 
1 1 0 
2 1 0 
3 1 0 
4 2 0 
5 2 0 
6 2 0 
7 3 1 
8 3 1 
9 3 1 
10 4 1 
11 4 1 

df = df.drop_duplicates() 
df 

    id sex 
0 1 0 
4 2 0 
7 3 1 
10 4 1 
+0

谢谢!这真的很有帮助。 – Renton

+0

@康顿干杯。 –

1

使用groupbyvalue_counts它默认排序,所以只有第一个索引需要通过[0]选择:

df = df.groupby('id')['sex'].apply(lambda x: x.value_counts().index[0]).reset_index() 
print (df) 
    id sex 
0 1 0 
1 2 0 
2 3 1 
3 4 1