对所有元素的通用迭代:嵌套列表,numpy数组,pandas数据帧

时间:2014-12-02 13:40:49

标签: python arrays numpy pandas

我正在尝试编写一个适用于所提供参数的每个元素的函数,无论参数是嵌套的python列表,numpy数组还是pandas数据帧或系列。

示例:(不工作)

import numpy as np
import pandas as pd

a = [[1,2,3,4,5], [6,7,8,9,10]]
b = np.array(a)
c = pd.DataFrame(a)

def printElement(x):
    print x

def iterateOverElements(arg):
    for element in arg:
        printElement(element)

iterateOverElements(a)
iterateOverElements(b)
iterateOverElements(c)

所需输出:为三个呼叫中的每一个打印新线路中的1,2,3,4,5,6,7,8,9,10。 (顺序并不重要。)

真实输出:

[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
[1 2 3 4 5]
[ 6  7  8  9 10]
0
1
2
3
4

正如所料,嵌套列表遍历其子列表,其行上的numpy数组和列标签上的pandas数据帧。

是否有一种简洁的方法来实现我的目标,或者我是否需要检查参数的实例并为不同类型构建不同的迭代代码?如果我需要进行类型检查,是否存在一种进口方式,例如pandas只是为了进行类型检查并发现它毕竟是一个嵌套列表?

同样,我不关心迭代元素的顺序,只是它真的是"基本"元素而不是某些子集合。

2 个答案:

答案 0 :(得分:0)

我会建议这样的事情:

def printElements(arg):
    x = arg.iterrows() if isinstance(arg, pd.DataFrame) else arg

    try:
        for element in x:
            printElements(element)
    except:
        print x

答案 1 :(得分:0)

将所有内容转换为NumPy数组并使用flat迭代器:

def iterateOverElements(arg):
    for element in np.asarray(arg).flat:
        printElement(element)