2014-12-02 2 views
1

Я пытаюсь написать функцию, которая применяется к каждому элементу предоставленного аргумента, является ли аргумент вложенным списком python, массивом numpy или pandas dataframe или серии.Универсальная итерация по всем элементам: вложенному списку, массиву numpy, pandas dataframe

Пример: (не работает)

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 в новых линиях для каждого из трех вызовов. (Приказ не имеет значения.)

True Выход:

[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 массив над рядами и панды dataframe над его заголовков столбцов.

Есть ли краткий путь к достижению моей цели, или мне нужно проверить экземпляр аргумента и построить разные коды итераций для разных типов? Если мне нужно проверить тип, есть ли способ импорта, например. pandas просто проверить тип и узнать, что он был вложенным списком в конце концов?

Опять же, меня не волнует порядок, в котором я повторяю элементы, просто, что это действительно «основные» элементы, а не какая-то подсекция.

+0

Различные типы имеют действительно различные идеи/проекты, как перебрать их элементы , Возможно, это несчастливо, но так оно и есть. Таким образом, вы можете проверить тип экземпляра или, предпочтительно, преобразовать значение в соответствующий тип, прежде чем передавать его в свою функцию (что-то вроде 'iterateOverElements (b.tolist())' или 'iterateOverElements (c.values.tolist()) '). – Evert

ответ

0

Я хотел бы предложить что-то вроде этого:

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

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

превратить все в массив NumPy и использовать flat итератора:

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

Для этого требуется всегда импортировать numpy, даже если iterateOverElements вызывается с вложенным списком pure python. Это то, что я хотел бы избежать, если это возможно. - Но пока самое компактное решение. – ARF

Смежные вопросы