我有一个数据帧df
user_id o_date month
2 3 2017-05-15 4
3 3 2017-05-15 4
6 1 2017-05-25 4
22 7 2017-05-27 4
25 1 2017-05-23 4
26 3 2017-05-12 4
29 3 2017-05-13 4
39 7 2017-05-08 4
70 1 2017-05-25 4
我想对'user_id'进行排序以获得一个新的数据帧,结果对象将按降序排列,以便第一个元素是最常出现的元素。就像方法Series.value_counts()
我希望output
像这样:
user_id o_date month
2 3 2017-05-15 4
3 3 2017-05-15 4
26 3 2017-05-12 4
29 3 2017-05-13 4
6 1 2017-05-25 4
25 1 2017-05-23 4
70 1 2017-05-25 4
22 7 2017-05-27 4
39 7 2017-05-08 4
那么如何获得output
THX!
编辑:
我得到了output
。现在,我想根据user_id
删除重复的o_date
(我选择频繁发生的user_id
o_date
,就像最后result
一样}:
user_id o_date month
2 3 2017-05-15 4
6 1 2017-05-25 4
22 7 2017-05-27 4
我是数据框架的新手,再次感谢!
答案 0 :(得分:1)
使用:
df = df.iloc[(-df['user_id'].map(df['user_id'].value_counts())).argsort()]
print (df)
user_id o_date month
2 3 2017-05-15 4
3 3 2017-05-31 4
26 3 2017-05-12 4
29 3 2017-05-13 4
6 1 2017-05-25 4
25 1 2017-05-23 4
70 1 2017-05-17 4
22 7 2017-05-27 4
39 7 2017-05-08 4
<强>解释强>:
1.首先按value_counts
print (df['user_id'].value_counts())
3 4
1 3
7 2
Name: user_id, dtype: int64
2. map
列user_id
print (df['user_id'].map(df['user_id'].value_counts()))
2 4
3 4
26 4
29 4
6 3
25 3
70 3
22 2
39 2
Name: user_id, dtype: int64
3.在argsort
获取descendent order的职位:
print ((-df['user_id'].map(df['user_id'].value_counts())).argsort())
2 0
3 1
26 2
29 3
6 4
25 5
70 6
22 7
39 8
Name: user_id, dtype: int64
4.最后由iloc
选择新订单
编辑:要按列使用drop_duplicates
删除dupes:
df = df.drop_duplicates('user_id')
print (df)
user_id o_date month
2 3 2017-05-15 4
6 1 2017-05-25 4
22 7 2017-05-27 4
答案 1 :(得分:0)
对jezrael的回答是一个非常酷的单行,但你也可以添加一些支持&#34;计数&#34;列,以防您需要监控频率:
df['count'] = df.groupby('user_id')['user_id'].transform(pd.Series.value_counts)
df.sort_values('count', ascending=False)
输出:
month user_id count
2 4 3 4
3 4 3 4
26 4 3 4
29 4 3 4
6 4 1 3
25 4 1 3
70 4 1 3
22 4 7 2
39 4 7 2