J J*_*nes 30 python dataframe pandas
在我的代码中,我有几个变量可以包含一个pandas DataFrame,或者根本没有.假设我想测试并查看是否已创建某个DataFrame.我的第一个想法是像这样测试它:
if df1:
# do something
Run Code Online (Sandbox Code Playgroud)
但是,该代码以这种方式失败:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)
很公平.理想情况下,我希望有一个适用于DataFrame或Python None的状态测试.
这是一种可行的方法:
if not isinstance(df1, type(None)):
# do something
Run Code Online (Sandbox Code Playgroud)
但是,测试类型真的很慢.
t = timeit.Timer('if None: pass')
t.timeit()
# approximately 0.04
t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
t.timeit()
# approximately 0.4
Run Code Online (Sandbox Code Playgroud)
哎哟.除了速度慢之外,对NoneType的测试也不是很灵活.
另一种解决方案是初始化df1为空DataFrame,以便在null和非null情况下类型都相同.然后我可以测试使用len(),或者any()类似的东西.但是,制作一个空的DataFrame似乎有些愚蠢和浪费.
另一种解决方案是使用指示符变量:在创建df1_exists之前设置为False df1.然后,df1我会测试,而不是测试df1_exists.但这似乎并不那么优雅.
是否有更好,更Pythonic的方式来处理这个问题?我错过了什么,或者这只是熊猫所有令人敬畏的事情的一个尴尬的副作用?
piR*_*red 50
选项1(我的首选方案)
如果您喜欢这种方法,请选择他的答案
初始化变量是非常惯用的python,None然后None在对该变量做某事之前检查它.
df1 = None
if df1 is not None:
print df1.head()
Run Code Online (Sandbox Code Playgroud)
选项2
但是,设置空数据帧并不是一个坏主意.
df1 = pd.DataFrame()
if not df1.empty:
print df1.head()
Run Code Online (Sandbox Code Playgroud)
选项3
就试一试吧.
try:
print df1.head()
# catch when df1 is None
except AttributeError:
pass
# catch when it hasn't even been defined
except NameError:
pass
Run Code Online (Sandbox Code Playgroud)
何时df1处于初始化状态或根本不存在
什么时候df1是包含内容的数据框
df1 = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde'))
df1
Run Code Online (Sandbox Code Playgroud)
Ami*_*ory 21
在我的代码中,我有几个变量可以包含一个pandas DataFrame,或者根本没有
表示"没有"的Pythonic方式是via None,并且用于检查"not nothing"via
if df1 is not None:
...
Run Code Online (Sandbox Code Playgroud)
我不确定这里有多关键时刻,但是因为你测量了一些东西:
In [82]: t = timeit.Timer('if x is not None: pass', setup='x=None')
In [83]: t.timeit()
Out[83]: 0.022536039352416992
In [84]: t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
In [85]: t.timeit()
Out[85]: 0.11571192741394043
Run Code Online (Sandbox Code Playgroud)
因此,检查某些东西is not None,也比isinstance替代方案更快.