扁平化(不规则)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
函数将向下递归内)。
尽管DataFrames
是collections.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 数据转换为扁平数据框
Python pandas:通过代理键将 JSON 扁平化为行的快速方法