在Python中展平(不规则的)列表,关于Pandas Dataframes

时间:2014-01-30 15:52:06

标签: python pandas yield flatten

这是一个关于Stackoverflow的递归问题,但给出here的解决方案仍然不完美。 Yielding仍然(对我来说)是python中最复杂的东西之一,所以我不知道如何自己修复它。

当给予该函数的任何列表中的项是Pandas数据帧时,flatten函数将返回其标题,而不是数据帧本身。您可以通过运行以下代码来明确地测试它:

import pandas
import collections
df = pandas.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
            for sub in flatten(el):
                yield sub
        else:
            yield el

然后,如果你调用参考帖子上给出的函数:

list(flatten([df]))   #['A', 'B', 'C', 'D']

而不是返回包含数据框的列表。 如何使函数变平对数据帧?

1 个答案:

答案 0 :(得分:3)

如果元素是flatten的实例并且它不是字符串(可迭代,但我们通常希望将其视为标量,我们就是这样的话)collections.Iterable函数会递归不打算看看里面。)

即使DataFramescollections.Iterable的实例,听起来您也希望它们也是终端。在那种情况下:

    if (isinstance(el, collections.Iterable) and 
        not isinstance(el, (basestring, pandas.DataFrame))):

之后:

>>> list(flatten([[1,2], "2", df]))
[1, 2, '2', <class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 4 columns):
A    100  non-null values
B    100  non-null values
C    100  non-null values
D    100  non-null values