Python Pandas 注意事项和问题
Caveats意味着警告,Gotcha意味着一个看不见的问题。
在Pandas中使用If/Truth语句
Pandas遵循numpy的惯例,当你试图将某些东西转换为 bool 时,会引发一个错误 。 这发生在使用布尔运算的 if 或,and, or ,or not 时 。 目前还不清楚结果应该是什么。它应该是True,因为它不是Zerolength?还是因为有假值而变成假的?目前还不清楚,因此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 或 任何一个. NET Framework。
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
isin操作
这将返回一个布尔系列,显示系列中的每个元素是否完全包含在传递的值序列中。
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
当然,在这种情况下,这完全等同于使用 重新索引的 方法-
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
重要的是要记住, reindex只是严格的标签索引。 这可能会导致一些潜在的令人惊讶的结果,比如说,在一个索引同时包含整数和字符串的病理情况下。