pandas烹饪指南
1. pandas支持文件类型表格
格式类型 | 数据类型 | 读取 | 写入 |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | JSON | read_json | to_json |
text | HTML | read_html | to_html |
text | Local clipboard | read_clipboard | to_clipboard |
binary | MS Excel | read_excel | to_excel |
binary | OpenDocument | read_excel | |
binary | HDF5 Format | read_hdf | to_hdf |
binary | Feather Format | read_feather | to_feather |
binary | Parquet Format | read_parquet | to_parquet |
binary | Msgpack | read_msgpack | to_msgpack |
binary | Stata | read_stata | to_stata |
binary | SAS | read_sas | |
binary | Python Pickle Format | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
SQL | Google Big Query | read_gbq | to_gbq |
2. 惯用语
2.2. 加载数据
1 | In [1]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
2.3. if-then…
在一列上执行 if-then 操作:
1 | In [3]: df.loc[df.AAA >= 5, 'BBB'] = -1 |
在两列上执行 if-then 操作:
1 | In [5]: df.loc[df.AAA >= 5, ['BBB', 'CCC']] = 555 |
再添加一行代码,执行 -else 操作:
1 | In [7]: df.loc[df.AAA < 5, ['BBB', 'CCC']] = 2000 |
或用 Pandas 的 where 设置掩码(mask):
1 | In [9]: df_mask = pd.DataFrame({'AAA': [True] * 4, |
用 NumPy where() 函数实现 if-then-else
1 | In [11]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
2.4. 切割
用布尔条件切割 DataFrame
1 | In [15]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
2.5. 设置条件
多条件选择
1 | In [15]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
和(&),不赋值,直接返回 Series:
1 | In [21]: df.loc[(df['BBB'] < 25) & (df['CCC'] >= -40), 'AAA'] |
或(|),不赋值,直接返回 Series:
1 | In [22]: df.loc[(df['BBB'] > 25) | (df['CCC'] >= -40), 'AAA'] |
或(|),赋值,修改 DataFrame:
1 | In [23]: df.loc[(df['BBB'] > 25) | (df['CCC'] >= 75), 'AAA'] = 0.1 |
2.6. 用 argsort 选择最接近指定值的行
1 | In [25]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
2.7. 用二进制运算符动态减少条件列表
1 | In [29]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
硬编码方式为:
1 | In [34]: AllCrit = Crit1 & Crit2 & Crit3 |
生成动态条件列表:
1 | In [35]: import functools |
3. 选择
3.1. 行标签与值作为条件
1 | In [39]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
3.2. 标签切片用 loc,位置切片用 iloc
1 | In [42]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
前 2 个是显式切片方法,第 3 个是通用方法:
- 位置切片,Python 切片风格,不包括结尾数据;
- 标签切片,非 Python 切片风格,包括结尾数据;
- 通用切片,支持两种切片风格,取决于切片用的是标签还是位置。
1 | In [43]: df.loc['bar':'kar'] # Label |
包含整数,且不从 0 开始的索引,或不是逐步递增的索引会引发歧义。
1 | In [46]: data = {'AAA': [4, 5, 6, 7], |
3.3. 用逆运算符 (~)提取掩码的反向内容
1 | In [50]: df = pd.DataFrame({'AAA': [4, 5, 6, 7], |
3.4. 用 applymap 高效动态生成新列
1 | In [53]: df = pd.DataFrame({'AAA': [1, 2, 1, 3], |
3.5. 分组时用 min()
1 | In [60]: df = pd.DataFrame({'AAA': [1, 1, 1, 2, 2, 2, 3, 3], |
方法1:用 idxmin() 提取每组最小值的索引
1 | In [62]: df.loc[df.groupby("AAA")["BBB"].idxmin()] |
方法 2:先排序,再提取每组的第一个值
1 | In [63]: df.sort_values(by="BBB").groupby("AAA", as_index=False).first() |
注意,提取的数据一样,但索引不一样。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AloneSoul's Blog!
评论