下面把 **“理论介绍 / 学习目标”** 全部补回,同时保留 **`None` 占位的练习代码**,方便您边读概念边动手。每一步依旧遵循:
> 理论介绍 → 编程任务(`None` 占位)→ 验证代码
---
## Pandas 基础入门教程 (Exercism 风格 · 占位版)
|步骤|主题|目标|
|---|---|---|
|1|DataFrame / Series 创建与属性|能构造表格并查看 shape、columns、dtypes 等元信息|
|2|CSV 读写|把 DataFrame 保存到硬盘并读回|
|3|数据选择与筛选|熟练使用 `loc` / `iloc` / 布尔索引|
|4|常见列操作|增删列、重命名、排序、唯一值、`value_counts`|
|5|缺失值处理|发现、填补、删除 NaN|
|6|分组聚合 `groupby`|按类别 Split-Apply-Combine|
|7|拼接与合并|`concat` 行扩展 & `merge` 键合并|
|8|apply / map|对列或行执行自定义函数 / 映射|
|9|类型转换|字符串→数值 / 字符串→日期|
|10|时间序列 & 重采样|DatetimeIndex 和按月汇总|
---
### 1 · DataFrame / Series 创建与基本属性
**理论介绍**
- **Series**:一维带索引的数据结构,可看作“带标签的数组”。
- **DataFrame**:二维表格,行索引 + 列标签。
- 核心属性:`.shape` 行列尺寸、`.index` 行索引、`.columns` 列名、`.dtypes` 每列类型。
- 快速预览:`head()` / `tail()`。
```python
import pandas as pd
# TODO: 创建整数 Series
s = None
# TODO: 创建 3×2 DataFrame(列 A,B)
df = None
print("Series:\n", s)
print("DataFrame:\n", df)
print("shape:", df.shape,
"| columns:", df.columns,
"| index:", df.index,
"| dtypes:", df.dtypes)
```
```python
assert isinstance(s, pd.Series)
assert isinstance(df, pd.DataFrame)
assert df.shape == (3, 2)
assert list(df.columns) == ['A', 'B']
assert s.iloc[0] == 10 and s.iloc[2] == 30
print("第1步验证通过!")
```
---
### 2 · CSV 数据读写
**理论介绍**
- `pd.read_csv`:把 CSV 文件加载为 DataFrame。
- `DataFrame.to_csv`:将数据写入 CSV。参数 `index=False` 可避免保存行索引。
- 常用参数还有 `sep`(分隔符)、`encoding`、`usecols` 等。
```python
import pandas as pd
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]
})
# TODO: 保存 df 至 CSV(省略行索引)
None
# TODO: 再读取回 df2
df2 = None
print(df2)
```
```python
assert df2.equals(df)
print("第2步验证通过!")
```
---
### 3 · 数据选择与筛选
**理论介绍**
- `loc[行标签, 列标签]`:按名字取值;切片“包含右端”。
- `iloc[行位置, 列位置]`:按整数位置;切片“不含右端”。
- 布尔索引 `df[条件]`:用 True/False 数组过滤行。
```python
import pandas as pd
df = pd.DataFrame({
'A':[10,15,20,25,30],
'B':[ 5, 6, 7, 8, 9],
'C':['X','Y','X','Y','X']
}, index=['a','b','c','d','e'])
# TODO: 取索引 'c' 行
row_c = None
# TODO: 取位置 2 行
row_c2 = None
# TODO: 行 b~d & 列 A,C
sub_df = None
# TODO: A 列 >20 的行
filtered_df = None
```
```python
assert row_c.equals(row_c2)
assert list(sub_df.index)==['b','c','d'] and list(sub_df.columns)==['A','C']
assert list(filtered_df.index)==['d','e']
print("第3步验证通过!")
```
---
### 4 · 常见列操作
**理论介绍**
- 新增列:`df['new']=...`
- 删除列:`df.drop(columns=[...])`
- 重命名:`df.rename(columns={'旧':'新'})`
- 排序:`df.sort_values(by='列', ascending=False)`
- 唯一值:`series.unique()`;计数:`series.value_counts()`。
```python
import pandas as pd
df = pd.DataFrame({
'Name':['Alice','Bob','Charlie','Bob'],
'Score':[85,90,85,75]
})
# TODO: 新增 Score2 = Score+5
df['Score2'] = None
# TODO: Name → Student
df = None
# TODO: 删除 Score2
df = None
# TODO: 按 Score 降序
sorted_df = None
# TODO: 唯一值 + 计数
unique_students = None
student_counts = None
```
```python
assert (sorted_df['Score'].diff().dropna()<=0).all()
assert student_counts['Bob']==2
print("第4步验证通过!")
```
---
### 5 · 缺失值处理
**理论介绍**
- `isnull()` 标记 NaN。
- `fillna()` 填补空值,可配合常数 / 前向填充。
- `dropna()` 删除含缺失的行/列;`how='any'|'all'` 控制条件。
```python
import pandas as pd
df = pd.DataFrame({
'A':[1,None,3,None,5],
'B':[10,20,None,None,50]
})
# TODO: 统计列缺失数
missing_counts = None
# TODO: NaN → 0
df_filled = None
# TODO: 删掉含任意 NaN 的行
dropped_any = None
# TODO: 删掉整行全 NaN
dropped_all = None
```
```python
assert missing_counts['A']==2 and missing_counts['B']==2
assert df_filled.isnull().sum().sum()==0
assert list(dropped_any.index)==[0,4]
assert 3 not in dropped_all.index
print("第5步验证通过!")
```
---
### 6 · 分组聚合 (`groupby`)
**理论介绍**
- `groupby('键')['数值列'].agg()` 可一次做求和、均值、计数。
- 聚合后索引为分组键,返回 Series 或 DataFrame。
```python
import pandas as pd
df = pd.DataFrame({
'Category':['A','B','A','B','B'],
'Value':[10,20,30,40,60]
})
# TODO: 组内求和
sum_by_cat = None
# TODO: 组内均值
mean_by_cat = None
# TODO: 组内计数
count_by_cat = None
```
```python
assert sum_by_cat['A']==40 and sum_by_cat['B']==120
assert mean_by_cat['B']==40
assert count_by_cat['A']==2
print("第6步验证通过!")
```
---
### 7 · 拼接与合并
**理论介绍**
- `pd.concat([...], axis=0/1)`:简单堆叠。
- `pd.merge(left, right, on='键', how='inner|outer|left|right')`:SQL-like join。
```python
import pandas as pd
df1 = pd.DataFrame({'City':['NY','LA'],'Pop':[8.4,4.0]})
df2 = pd.DataFrame({'City':['CHI','HOU'],'Pop':[2.7,2.3]})
# TODO: 行拼接
df_concat = None
df3 = pd.DataFrame({'City':['NY','LA','CHI'],'State':['NY','CA','IL']})
df4 = pd.DataFrame({'City':['CHI','NY','SEA'],'Mayor':['LL','EA','BH']})
# TODO: City 内连接
df_merged = None
# TODO: City 外连接
df_merged_outer = None
```
```python
assert df_concat.shape==(4,2)
assert set(df_merged['City'])=={'NY','CHI'}
assert df_merged_outer.shape[0]==4
print("第7步验证通过!")
```
---
### 8 · apply / map
**理论介绍**
- `Series.apply(func)`:对每个元素执行函数。
- `Series.map(dict_or_func)`:映射替换。
- `DataFrame.apply(func, axis=1)`:逐行/列自定义计算。
```python
import pandas as pd
df = pd.DataFrame({
'Student':['Alice','Bob','Charlie','David'],
'Score':[85,92,77,60]
})
# TODO: 生成 Passed 列
df['Passed'] = None
# TODO: 姓名映射为 ID
id_map = {'Alice':1001,'Bob':1002,'Charlie':1003,'David':1004}
df['ID'] = None
```
```python
assert list(df['Passed'])==['Yes' if x>=80 else 'No' for x in df['Score']]
assert list(df['ID'])==[id_map[n] for n in df['Student']]
print("第8步验证通过!")
```
---
### 9 · 类型转换
**理论介绍**
- `astype()` 改数值/类别等 dtype。
- `pd.to_datetime()` 把字符串解析为日期。
```python
import pandas as pd
df = pd.DataFrame({
'date_str':['2020-01-01','2021-06-15','2020-12-31'],
'temp_str':['30.5','35.0','28.0']
})
# TODO: 字符串 → datetime
df['date'] = None
# TODO: 字符串 → float
df['temp'] = None
```
```python
assert df['date'].dtype=='datetime64[ns]'
assert df['temp'].dtype=='float64'
assert df.loc[1,'date'].year==2021
print("第9步验证通过!")
```
---
### 10 · 时间序列与重采样
**理论介绍**
- `pd.date_range` 生成日期索引。
- `resample('M').sum()`:把日数据聚合到月度。
```python
import pandas as pd
dates = pd.date_range('2021-01-01','2021-02-28',freq='D')
ts_df = pd.DataFrame({'Value':range(1,len(dates)+1)}, index=dates)
# TODO: 月度汇总
monthly_sum = None
```
```python
assert monthly_sum.shape[0]==2
assert monthly_sum.loc['2021-01-31','Value']==496
assert monthly_sum.loc['2021-02-28','Value']==1274
print("第10步验证通过!")
```
---
阅读理论 → 填写 `None` → 运行验证,
全部 “验证通过” 即完成 10 小时 Pandas 基础练习。祝学习愉快!