题目:1741. 查找每个员工花费的总时间
输入
Employees table:
+--------+------------+---------+----------+
| emp_id | event_day | in_time | out_time |
+--------+------------+---------+----------+
| 1 | 2020-11-28 | 4 | 32 |
| 1 | 2020-11-28 | 55 | 200 |
| 1 | 2020-12-03 | 1 | 42 |
| 2 | 2020-11-28 | 3 | 33 |
| 2 | 2020-12-09 | 47 | 74 |
+--------+------------+---------+----------+
预期结果
+------------+--------+------------+
| day | emp_id | total_time |
+------------+--------+------------+
| 2020-11-28 | 1 | 173 |
| 2020-11-28 | 2 | 30 |
| 2020-12-03 | 1 | 41 |
| 2020-12-09 | 2 | 27 |
+------------+--------+------------+
无reset_index()时
代码
import pandas as pd
def total_time(employees: pd.DataFrame) -> pd.DataFrame:
employees['inter_time'] = employees['out_time'] - employees['in_time']
employees = employees.groupby(['emp_id', 'event_day'])['inter_time'].sum()
print(employees)
print(type(employees))
输出
emp_id event_day
1 2020-11-28 173
2020-12-03 41
2 2020-11-28 30
2020-12-09 27
Name: inter_time, dtype: Int64
<class 'pandas.core.series.Series'>
有reset_index()时
代码
import pandas as pd
def total_time(employees: pd.DataFrame) -> pd.DataFrame:
employees['inter_time'] = employees['out_time'] - employees['in_time']
employees = employees.groupby(['emp_id', 'event_day'])['inter_time'].sum().reset_index()
print(employees)
print(type(employees))
输出
emp_id event_day inter_time
0 1 2020-11-28 173
1 1 2020-12-03 41
2 2 2020-11-28 30
3 2 2020-12-09 27
<class 'pandas.core.frame.DataFrame'>
reset_index()作用
reset_index() 是 pandas 库中的一个方法,它的主要作用是对索引进行重置。当你使用 groupby 方法对数据进行聚合后,你会得到一个 Series,这个 Series 的索引是组合的列名(在你的例子中是 'emp_id' 和 'event_day',多重索引)。reset_index() 方法将这个索引重置为默认的整数索引,并且如果需要的话,它还可以创建一个新的列来保存原来的索引。
在你的例子中,reset_index() 将根据 'emp_id' 和 'event_day' 的值为新的 DataFrame 创建索引,而原本的数值则作为新的 DataFrame 的一列,这就是为什么 reset_index() 能够将 Series 转化为 DataFrame 的原因。
因此,reset_index() 方法是一个非常实用的工具,可以帮助你在进行数据聚合操作后,将结果从 Series 格式转化为更易于分析和使用的 DataFrame 格式。
解题代码
import pandas as pd
def total_time(employees: pd.DataFrame) -> pd.DataFrame:
employees['inter_time'] = employees['out_time'] - employees['in_time']
employees: pd.DataFrame = employees.groupby(['emp_id', 'event_day'])['inter_time'].sum().reset_index()
employees.rename(columns={'event_day': 'day', 'inter_time': 'total_time'}, inplace=True)
return employees[['day', 'emp_id', 'total_time']]