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

Zha*_*g18 16 python arrays numpy list pandas

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

 1. pandas Series
 2. numpy array (ndarray)
 3. python list
Run Code Online (Sandbox Code Playgroud)

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

Mir*_*ber 14

你可以使用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')
Run Code Online (Sandbox Code Playgroud)

然后f([1,2,3])打印5,同时f(3.34)引发错误.

  • @Zhang18,您也可以使用 pd.Series。我使用 pd.core.series.Series 只是因为 type(pd.Series([1,2,3])) 给出了 pd.core.series.Series。然而,它们都可以工作,因为 pd.Series==pd.core.series.Series 是 True (2认同)

Vai*_*ali 11

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

l = [1,2]
s= pd.Series(l)
arr = np.array(l) 
Run Code Online (Sandbox Code Playgroud)

当你打印

type(l)
list

type(s)
pandas.core.series.Series

type(arr)
numpy.ndarray
Run Code Online (Sandbox Code Playgroud)


Ric*_*ica 11

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

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

它很好,因为与以下内容相比,它提供了更多的鸭子类型灵活性:

if isinstance(l, (pd.Series, list, np.ndarray)):
    # this is ONLY a pd.Series, list, or ndarray
Run Code Online (Sandbox Code Playgroud)

...但它比这更好,它允许使用字符串或迭代器——这两者通常都是不需要的:

if isinstance(l, typing.Iterable):
    # this any iterable
Run Code Online (Sandbox Code Playgroud)

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

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

但是,如果您确实只想要listndarray、 或Series,则其他答案更好。