Python - 在数据框中选择最小值

时间:2018-02-25 20:18:33

标签: python pandas dataframe

我有一个如下所示的数据框:

enter image description here

如何在同一日期创建一个仅包含用户最小“时间”值的新数据框?

所以我想要一个具有相同结构的数据框,但只有一个“时间”用于用户的“日期”。

所以它应该是这样的:

enter image description here

2 个答案:

答案 0 :(得分:2)

 

更新1

#User included into grouping

不是最简单的方法,而是简单

df = pd.DataFrame(np.datetime64('2016')+
             np.random.randint(0,3*24,
                    size=(7,1)).astype('<m8[h]'),
             columns =['DT']).join(pd.Series(list('abcdefg'),name='str_val')
                ).join(pd.Series(list('UAUAUAU'),name='User'))
df['Date'] = df.DT.dt.date
df['Time'] = df.DT.dt.time
df.drop(columns = ['DT'],inplace=True)
print (df)

输出:

  str_val User        Date      Time
0       a    U  2016-01-01  04:00:00
1       b    A  2016-01-01  10:00:00
2       c    U  2016-01-01  20:00:00
3       d    A  2016-01-01  22:00:00
4       e    U  2016-01-02  04:00:00
5       f    A  2016-01-02  23:00:00
6       g    U  2016-01-02  09:00:00

获取值的代码

print (df.sort_values(['Date','User','Time']).groupby(['Date','User']).first())

输出:

Date       User                  
2016-01-01 A          b  10:00:00
           U          a  04:00:00
2016-01-02 A          f  23:00:00
           U          e  04:00:00

答案 1 :(得分:2)

按时间列对值进行排序,并在Date + User_name中检查重复项。但是为了确保09:00低于10:00,我们可以先将字符串转换为时间。

import pandas as pd

data = {
    'User_name':['user1','user1','user1', 'user2'],
    'Date':['8/29/2016','8/29/2016', '8/31/2016', '8/31/2016'],
    'Time':['9:07:41','9:07:42','9:07:43', '9:31:35']
}

# Recreate sample dataframe
df = pd.DataFrame(data)

备选方案1(更快):

#100 loops, best of 3: 1.73 ms per loop

# Create a mask 
m = (df.reindex(pd.to_datetime(df['Time']).sort_values().index)
     .duplicated(['Date','User_name']))

# Apply inverted mask
df = df.loc[~m]

备选方案2(更易读):

一种更简单的方法是将df [&#39; Time&#39;]列重新制作为datetime,并按日期和User_name对其进行分组并获取idxmin()。这将是我们的面具。 (感谢jezrael)

# 100 loops, best of 3: 4.34 ms per loop

# Create a mask
m = pd.to_datetime(df['Time']).groupby([df['Date'],df['User_name']]).idxmin()

df = df.loc[m]

输出:

        Date     Time User_name
0  8/29/2016  9:07:41     user1
2  8/31/2016  9:07:43     user1
3  8/31/2016  9:31:35     user2