如何检查变量是python列表,numpy数组还是pandas系列

时间:2017-05-02 23:57:56

标签: python arrays list pandas numpy

我有一个函数,它接受一个变量,如果它是以下三种类型中的任何一种

 1. pandas Series
 2. numpy array (ndarray)
 3. python list

任何其他类型都应该被拒绝。检查这个的最有效方法是什么?

6 个答案:

答案 0 :(得分:7)

您可以使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="icon-rotate"> <img src="http://68.media.tumblr.com/6324fd64b78c316379713480b8e44d29/tumblr_nd1rffWqEa1ryzl2ko1_1280.jpg" /> </div>执行此操作:

isinstance

然后import pandas as pd import numpy as np def f(l): if isinstance(l,(list,pd.core.series.Series,np.ndarray)): print(5) else: raise Exception('wrong type') 打印5而f([1,2,3])会引发错误。

答案 1 :(得分:7)

Python type()应该在这里完成工作

l = [1,2]
s= pd.Series(l)
arr = np.array(l) 

打印时

type(l)
list

type(s)
pandas.core.series.Series

type(arr)
numpy.ndarray

答案 2 :(得分:3)

这一切都取决于你想要实现的目标(你会允许一个元组,一个range对象怎么样?),但是限制性较小但仍然不允许字符串(我猜是您真正想要实现的目标)您可以使用以下代码。

import collections
import pandas
import numpy

def myfunc(x):
    if not isinstance(x, collections.abc.Iterable) or isinstance(x, (str, bytes)):
        raise ValueError('A non-string iterable is required')
    return 'Yay!'

myfunc([9, 7])
myfunc((9, 7))
myfunc(numpy.arange(9))
myfunc(range(9))
myfunc(pandas.Series([9, 7]))
myfunc('Boo')  # THIS WILL RAISE A ValueError!!!!!

答案 3 :(得分:3)

其他答案都很好,但我更喜欢这种方式:

if np.ndim(l)!=0:
    # this is something like a series, list, ndarray, etc.

这很好,因为与以下相比,它提供了更多的鸭子输入灵活性:

if isinstance(l, (pd.Series, list, np.ndarray)):
    # this is ONLY a pd.Series, list, or ndarray

...但它比这更好,尽管它允许一个字符串或一个迭代器——这两者通常都是不想要的:

if isinstance(l, typing.Iterable):
    # this any iterable

...或者 this,它排除了一个字符串,但(奇怪地)不排除了一个迭代器:

if not np.isscalar(l):
    # this is something like a series, list, ndarray, etc.

但是,如果您真的只想要一个 listndarraySeries,则最好使用其他答案。

答案 4 :(得分:0)

您可以像这样使用isinstance:

import pandas as pd
import numpy as np

#Simple List
simple_list = [1,2]  

#numpy array
np_array = np.array(simple_list) 

#Pandas series
pandas_series = pd.Series(simple_list)  


if isinstance(simple_list, list):
    print("This is a list: ", simple_list)

if isinstance(np_array, np.ndarray):
    print("This is a numpy array: ", np_array)

if isinstance(pandas_series, pd.core.series.Series):
    print("This is pandas series: ", pandas_series)

答案 5 :(得分:0)

虽然接受的答案使用内置的 isinstance,但当接受的数据类型已知时,它本身应该是首选方式。

在我看来,使用 pandas.api.types 中的检查更加灵活和稳健,它涵盖了更广泛的 dtype 检查。例如,pd.api.types.is_list_like 检查被视为类列表的对象是例如 Python 列表、元组、集合、NumPy 数组和 Pandas 系列。

请注意,我们也可以测试嵌套和平面列表之类的对象,

import pandas as pd

pd.api.types.is_list_like([1,2,3]), pd.api.types.is_list_like(np.array([[1], [2], [3]]))    
<块引用>

(真,真)

虽然下面给出,

pd.api.types.is_list_like("This is a string not a list like object")
<块引用>

错误

这在需要更广泛的检查时特别有用,例如使用 pandas.api.types.is_re_compilable 检查输入字符串是否可以编译为有效的正则表达式模式,并使用 pandas.api.types.is_datetime64_ns_dtype 检查输入是否为 datetime64[ns ] 数据类型。