我有一个函数,它接受一个变量,如果它是以下三种类型中的任何一种
1. pandas Series
2. numpy array (ndarray)
3. python list
任何其他类型都应该被拒绝。检查这个的最有效方法是什么?
答案 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.
但是,如果您真的只想要一个 list
、ndarray
或 Series
,则最好使用其他答案。
答案 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 ] 数据类型。