dataframe对列进行排序并删除重复的值

时间:2018-04-26 11:18:49

标签: python-3.x pandas dataframe

我有一个数据帧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

我是数据框架的新手,再次感谢!

2 个答案:

答案 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. mapuser_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