这是一个关于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']
而不是返回包含数据框的列表。 如何使函数变平对数据帧?
答案 0 :(得分:3)
如果元素是flatten
的实例并且它不是字符串(可迭代,但我们通常希望将其视为标量,我们就是这样的话)collections.Iterable
函数会递归不打算看看里面。)
即使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