- Python pandas教程
- Python Pandas - 主页
- Python Pandas - 简介
- Python Pandas - 环境设置
- 数据结构简介
- Python pandas - 系列
- Python Pandas - 数据帧
- Python Pandas - 面板
- Python Pandas - 基本功能
- 描述性统计
- 功能应用
- Python Pandas - 重新索引
- Python Pandas - 迭代
- Python Pandas - 排序
- 处理文本数据
- 选项和定制
- 索引和选择数据
- 统计功能
- Python Pandas - 窗口函数
- Python Pandas - 聚合
- Python Pandas - 缺失数据
- Python Pandas - GroupBy
- Python Pandas - 合并/连接
- Python Pandas - 连接
- Python Pandas - 日期功能
- Python Pandas - Timedelta
- Python Pandas - 分类数据
- Python Pandas - 可视化
- Python Pandas - IO 工具
- Python Pandas - 稀疏数据
- Python Pandas - 注意事项和陷阱
- 与SQL的比较
- Python Pandas 有用资源
- Python Pandas - 快速指南
- Python Pandas - 有用的资源
- Python Pandas - 讨论
Python Pandas - 注意事项和陷阱
Caveats 意味着警告,gotcha 意味着看不见的问题。
对 Pandas 使用 If/Truth 语句
Pandas 遵循 numpy 约定,当您尝试将某些内容转换为bool时会引发错误。这种情况发生在if或使用布尔运算 and、or或not时。目前还不清楚结果应该是什么。它应该是 True 因为它不是零长度吗?False 因为有 False 值?目前尚不清楚,因此 Pandas 会引发ValueError -
import pandas as pd if pd.Series([False, True, False]): print 'I am True'
其输出如下 -
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool() a.item(),a.any() or a.all().
在if条件下,尚不清楚如何处理它。该错误表明是否使用None或其中任何一个。
import pandas as pd if pd.Series([False, True, False]).any(): print("I am any")
其输出如下 -
I am any
要在布尔上下文中评估单元素 pandas 对象,请使用方法.bool() -
import pandas as pd print pd.Series([True]).bool()
其输出如下 -
True
按位布尔值
按位布尔运算符,例如 == 和! = 将返回一个布尔系列,这几乎总是所需要的。
import pandas as pd s = pd.Series(range(5)) print s==4
其输出如下 -
0 False 1 False 2 False 3 False 4 True dtype: bool
正在运行
这将返回一个布尔系列,显示系列中的每个元素是否完全包含在传递的值序列中。
import pandas as pd s = pd.Series(list('abc')) s = s.isin(['a', 'c', 'e']) print s
其输出如下 -
0 True 1 False 2 True dtype: bool
重新索引与 ix 陷阱
许多用户会发现自己使用ix 索引功能作为从 Pandas 对象中选择数据的简洁方法 -
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'],index=list('abcdef')) print df print df.ix[['b', 'c', 'e']]
其输出如下 -
one two three four a -1.582025 1.335773 0.961417 -1.272084 b 1.461512 0.111372 -0.072225 0.553058 c -1.240671 0.762185 1.511936 -0.630920 d -2.380648 -0.029981 0.196489 0.531714 e 1.846746 0.148149 0.275398 -0.244559 f -1.842662 -0.933195 2.303949 0.677641 one two three four b 1.461512 0.111372 -0.072225 0.553058 c -1.240671 0.762185 1.511936 -0.630920 e 1.846746 0.148149 0.275398 -0.244559
当然,在这种情况下,这与使用reindex方法完全等效 -
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'],index=list('abcdef')) print df print df.reindex(['b', 'c', 'e'])
其输出如下 -
one two three four a 1.639081 1.369838 0.261287 -1.662003 b -0.173359 0.242447 -0.494384 0.346882 c -0.106411 0.623568 0.282401 -0.916361 d -1.078791 -0.612607 -0.897289 -1.146893 e 0.465215 1.552873 -1.841959 0.329404 f 0.966022 -0.190077 1.324247 0.678064 one two three four b -0.173359 0.242447 -0.494384 0.346882 c -0.106411 0.623568 0.282401 -0.916361 e 0.465215 1.552873 -1.841959 0.329404
基于此,有些人可能会得出ix和reindex 100% 等效的结论。除了整数索引的情况之外都是如此。例如,上述操作也可以表示为 -
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'],index=list('abcdef')) print df print df.ix[[1, 2, 4]] print df.reindex([1, 2, 4])
其输出如下 -
one two three four a -1.015695 -0.553847 1.106235 -0.784460 b -0.527398 -0.518198 -0.710546 -0.512036 c -0.842803 -1.050374 0.787146 0.205147 d -1.238016 -0.749554 -0.547470 -0.029045 e -0.056788 1.063999 -0.767220 0.212476 f 1.139714 0.036159 0.201912 0.710119 one two three four b -0.527398 -0.518198 -0.710546 -0.512036 c -0.842803 -1.050374 0.787146 0.205147 e -0.056788 1.063999 -0.767220 0.212476 one two three four 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 4 NaN NaN NaN NaN
重要的是要记住,重新索引只是严格的标签索引。在索引同时包含整数和字符串的病态情况下,这可能会导致一些潜在的令人惊讶的结果。