30 天 Pandas 挑战 Day16:reset_index()将结果从 Series转为DataFrame

题目: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

有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

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']]

rename函数同时给多列rename时记得colunms=不能省略,参数名传递,不能用位置传递。

你可能感兴趣的:(pandas,python,机器学习)