扁平化(不规则)Python 中关于 Pandas Dataframes 的列表列表

Posted

技术标签:

【中文标题】扁平化(不规则)Python 中关于 Pandas Dataframes 的列表列表【英文标题】:Flatten (an irregular) list of lists in Python respecting Pandas Dataframes 【发布时间】:2014-02-23 00:43:42 【问题描述】:

这是 *** 上的一个递归问题,但给出的解决方案 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】:

如果元素是 collections.Iterable 的实例并且它不是字符串(这是可迭代的,但我们通常希望将其视为标量,我们不会查看),则 flatten 函数将向下递归内)。

尽管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

【讨论】:

太好了,谢谢,正是我正在寻找的。我知道如何修补它,但这比我要做的更优雅:)

以上是关于扁平化(不规则)Python 中关于 Pandas Dataframes 的列表列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 和 pandas 将多数组 json 数据转换为扁平数据框

pandas中关于DataFrame 去除省略号

Python pandas:通过代理键将 JSON 扁平化为行的快速方法

我正在寻找一种有效的方法来连接和合并 pandas DataFrame 中关于某些标准的行

Vector在CANdb++中关于XCP和应用报文的定义

Vector在CANdb++中关于XCP和应用报文的定义