Pandas秘籍【第四章】

原文:Chapter 4

import pandas as pd
pd.set_option('display.mpl_style', 'default') # 使图表漂亮一些
figsize(15, 5)

好的! 我们将在这里回顾我们的自行车道数据集。 我住在蒙特利尔,我很好奇我们是一个通勤城市,还是以骑自行车为乐趣的城市 - 人们在周末还是工作日骑自行车?

4.1 向我们的DataFrame中刚添加weekday

首先我们需要加载数据,我们之前已经做过了。

bikes = pd.read_csv('../data/bikes.csv', sep=';', encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')
bikes['Berri 1'].plot()
<matplotlib.axes.AxesSubplot at 0x30d8610>

这里写图片描述

这里写图片描述

接下来,我们只是看看 Berri 自行车道。 Berri 是蒙特利尔的一条街道,是一个相当重要的自行车道。 现在我习惯走这条路去图书馆,但我在旧蒙特利尔工作时,我习惯于走这条路去上班。

所以我们要创建一个只有 Berri 自行车道的DataFrame

berri_bikes = bikes[['Berri 1']]
berri_bikes[:5]
Berri 1
Date
2012-01-01
2012-01-02
2012-01-03
2012-01-04
2012-01-05

接下来,我们需要添加一列weekday。 首先,我们可以从索引得到星期。 我们还没有谈到索引,但索引在上面的DataFrame中是左边的东西,在Date下面。 它基本上是一年中的所有日子。

berri_bikes.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-01-01 00:00:00, ..., 2012-11-05 00:00:00]
Length: 310, Freq: None, Timezone: None

你可以看到,实际上缺少一些日期 - 实际上只有一年的 310 天。 天知道为什么。

Pandas 有一堆非常棒的时间序列功能,所以如果我们想得到每一行的月份中的日期,我们可以这样做:

berri_bikes.index.day
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  1,  2,  3,
        4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
       21, 22, 23, 24, 25, 26, 27, 28, 29,  1,  2,  3,  4,  5,  6,  7,  8,
        9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
       26, 27, 28, 29, 30, 31,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
       12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
       29, 30,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
       16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  1,
        2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
       19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,  1,  2,  3,  4,  5,
        6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
       23, 24, 25, 26, 27, 28, 29, 30, 31,  1,  2,  3,  4,  5,  6,  7,  8,
        9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
       26, 27, 28, 29, 30, 31,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
       12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
       29, 30,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
       16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  1,
        2,  3,  4,  5], dtype=int32)

我们实际上想要星期:

berri_bikes.index.weekday
array([6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0,
       1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2,
       3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4,
       5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6,
       0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1,
       2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3,
       4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5,
       6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0,
       1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2,
       3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4,
       5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6,
       0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1,
       2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3,
       4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0], dtype=int32)

这是周中的日期,其中 0 是星期一。我通过查询日历得到 0 是星期一。

现在我们知道了如何获取星期,我们可以将其添加到我们的DataFrame中作为一列:

berri_bikes['weekday'] = berri_bikes.index.weekday
berri_bikes[:5]
Berri 1weekday
Date
2012-01-0135
2012-01-0283
2012-01-03135
2012-01-04144
2012-01-05197

4.2 按星期统计骑手

这很易于实现!

Dataframe有一个类似于 SQLgroupby.groupby()方法,如果你熟悉的话。 我现在不打算解释更多 - 如果你想知道更多,请见文档

在这种情况下,berri_bikes.groupby('weekday').aggregate(sum)`意味着“按星期对行分组,然后将星期相同的所有值相加”。

weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
weekday_counts
Berri 1
weekday
0
1
2
3
4
5
6

很难记住0, 1, 2, 3, 4, 5, 6是什么,所以让我们修复它并绘制出来:

weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_counts
Berri 1
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
weekday_counts.plot(kind='bar')
<matplotlib.axes.AxesSubplot at 0x3216a90>

这里写图片描述

所以看起来蒙特利尔是通勤骑自行车的人 - 他们在工作日骑自行车更多。

4.3 放到一起

让我们把所有的一起,证明它是多么容易。 6 行的神奇 Pandas!

如果你想玩一玩,尝试将sum变为maxnp.median,或任何你喜欢的其他函数。

bikes = pd.read_csv('../data/bikes.csv', 
                    sep=';', encoding='latin1', 
                    parse_dates=['Date'], dayfirst=True, 
                    index_col='Date')
# 添加 weekday 列
berri_bikes = bikes[['Berri 1']]
berri_bikes['weekday'] = berri_bikes.index.weekday

# 按照星期累计骑手,并绘制出来
weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_counts.plot(kind='bar')
### 关于 Pandas 数据处理包第三章的练习题或教程 以下是针对 Pandas 数据处理包第三章的相关内容总结以及一些常见的练习题目: #### 使用 `isnull()` 和 `isna()` 处理缺失值 在 Pandas 中,`isnull()` 或者 `isna()` 函数用于检测 DataFrame 中是否存在缺失值。这些函数返回布尔型 DataFrame,其中每个单元格表示对应位置是否有缺失值[^2]。 ```python import pandas as pd df = pd.DataFrame({ 'A': [1, 2, None], 'B': [None, 4, 5] }) print(df.isnull()) ``` 上述代码会输出一个布尔矩阵,指示哪些位置存在缺失值。 --- #### 增加新列并计算平均分 通过简单的算术运算可以在现有数据集中新增一列。例如,在学生分数表中添加“平均”这一列来存储每位学生的平均成绩[^3]。 ```python data['平均'] = round((data['语文'] + data['数学'] + data['英语']) / 3, 2) ``` 此操作会对每一行执行指定的计算逻辑,并将结果存入新的列中。 --- #### 排序功能的应用 利用 `sort_values()` 方法可以根据某列或多列对整个表格进行升序或者降序排列。如果需要按某一特定字段(比如薪资水平)做降序排序,则可如下实现[^5]: ```python sorted_df = df.sort_values('salary', ascending=False) ``` 这一步骤对于数据分析过程中快速定位最高/最低值非常有用。 --- #### 将处理后的数据保存至 CSV 文件 当完成一系列变换之后,经常希望把最终版本导出成外部文件形式以便后续查阅或其他程序调用。借助 `to_csv()` 可轻松达成目标。 ```python data.to_csv('output.csv', index=False) ``` 这里设置参数 `index=False` 是为了避免额外写出索引信息。 --- #### 更复杂的场景——多条件过滤与聚合统计 假设我们有一份包含多个区域及其下属学校的课程列表,想要了解各个区域内有多少门不同的课被教授过。可以通过以下方式解决这个问题[^4]: ```python grouped_courses_count = ( df.groupby(['Area']) .agg({'Course': lambda x: len(set(x))}) ) print(grouped_courses_count) ``` 这段脚本先依据地区名分组,再应用自定义汇总规则去重计数每组内的唯一课程数目。 --- ### 总结 以上涵盖了几个典型的基于 Pandas 的数据预处理技巧,包括但不限于查找空白项、追加辅助指标、调整展示顺序还有持久化成果等环节。随着实践深入,读者能够更加熟练运用这些工具满足实际项目需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值