【问题标题】:Universal iteration over all elements of: nested list, numpy array, pandas dataframe对所有元素的通用迭代:嵌套列表、numpy 数组、pandas 数据框
【发布时间】:2015-01-30 18:53:18
【问题描述】:

我正在尝试编写一个适用于所提供参数的每个元素的函数,无论该参数是嵌套 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 只是为了进行类型检查并发现它毕竟是一个嵌套列表?

同样,我不关心迭代元素的顺序,只是它实际上是“基本”元素而不是某些子集合。

【问题讨论】:

  • 不同的类型确实有不同的想法/设计如何迭代它们的元素。也许很不幸,但这就是目前的情况。因此,您可以检查实例类型,或者,最好将值转换为正确的类型,然后再将其传递给您的函数(类似于iterateOverElements(b.tolist())iterateOverElements(c.values.tolist()))。

标签: python arrays numpy pandas


【解决方案1】:

我会建议这样的事情:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这需要始终导入 numpy,即使使用纯 python 嵌套列表调用 iterateOverElements 也是如此。如果可能的话,这是我想避免的事情。 - 但迄今为止最紧凑的解决方案。
    猜你喜欢
    • 2020-09-28
    • 2013-05-05
    • 2019-04-04
    • 2012-03-22
    • 2017-06-15
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多