如何检查变量是 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.Series
和pd.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.
但是,如果您真的只想要 list
、ndarray
或 Series
,则最好选择其他答案。
【讨论】:
【参考方案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 系列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SWIG 将 C++ 数组转换为 Python 列表?