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

Posted

技术标签:

【中文标题】如何检查变量是 python 列表、numpy 数组还是 pandas 系列【英文标题】:How to check if a variable is either a python list, numpy array or pandas series 【发布时间】:2017-09-30 15:11:02 【问题描述】:

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

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

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

【问题讨论】:

tuple 怎么样?我问是因为您可能过度限制了您的输入。 那么你建议检查输入是否是一个类似列表的对象,包括np.ndarray和pd.Series?无论如何,我一直在寻找比当前接受的答案更优雅的东西。 【参考方案1】:

您可以使用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')

然后f([1,2,3]) 打印 5 而f(3.34) 引发错误。

【讨论】:

pd.core.series.Seriespd.Series有什么区别? @Zhang18,你也可以使用 pd.Series。我使用 pd.core.series.Series 只是因为 type(pd.Series([1,2,3])) 给出了 pd.core.series.Series。然而,它们都有效,因为 pd.Series==pd.core.series.Series 是 True 很可能,Series 实际上是在pd.core.series 模块中定义的,但是为了方便起见,然后将Series 类从那里导入***__init__.py【参考方案2】:

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

【讨论】:

【参考方案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!!!!!

【讨论】:

【参考方案4】:

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

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

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

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

但是,如果您真的只想要 listndarraySeries,则最好选择其他答案。

【讨论】:

【参考方案5】:

你可以像这样使用 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)

【讨论】:

【参考方案6】:

虽然接受的答案使用内置的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] dtype。

【讨论】:

以上是关于如何检查变量是 python 列表、numpy 数组还是 pandas 系列的主要内容,如果未能解决你的问题,请参考以下文章

Python 列表给出了 Numpy 数组的错误?

如何使用 SWIG 将 C++ 数组转换为 Python 列表?

如何检查操作系统变量并将它们与列表中的 Python 变量同名使用

如何在 Python 中从 Numpy 矩阵创建列表

python中如何取一列数最大值

将张量变量(非常数)转换为 numpy 数组? [复制]