Pandas:DataFrame内嵌DataFrame

9
我需要创建一个包含DataFrames列的DataFrame。放入该列的DataFrames大小不同,我遇到了StopIteration异常。如果DataFrames的大小相同,则不会出现这种情况。我知道Panel更适合此任务,但在这种情况下我需要一个DataFrame
a=pd.DataFrame({'cat1':['one','two','three'],'cat2':['four','five','six']})
b=pd.DataFrame({'cat1':['ten','eleven'],'cat2':['twelve','thirteen']})
pd.DataFrame({'col1':{'row1':a,'row2':b}})

如果我从'cat1'和'cat2'中分别删除'three'和'six',那么这个问题就可以解决。你有什么办法可以做到这一点吗?


在Pandas的作者的《Python数据分析》书中,我没看到提到过DataFrame中有DataFrame的情况。请问你的最终目标是什么? - Maxim Egorushkin
我有一个证券列表,横跨许多字段。其中一些字段会生成表格(例如持有人列表或股息历史记录),我想将其与标量值(价格、百分比变化、名称等)结合起来。我已经有了一个面板视图,但希望拥有整个表的单个视图。这只是为了能够在代码中推广这种方法,即使字段形状不同,我也可以始终采用DF.ix ['security','field']。我想用panel [security] [field]来实现这个目标。我只是试图尝试推广这种方法。 - jorge.santos
1个回答

6

这不是一个好主意,因为所有的东西都被视为object数据类型,操作会非常缓慢(因为无法通过c级别的基本类型,如float/int进行操作)。更好的方法是使用多级索引,可以轻松地包含您想要的内容。

In [20]: a
Out[20]: 
    cat1  cat2
0    one  four
1    two  five
2  three   six

In [21]: b
Out[21]: 
     cat1      cat2
0     ten    twelve
1  eleven  thirteen

In [22]: pd.concat([ a, b ], keys={ 'row1' : a, 'row2' : b })
Out[22]: 
          cat1      cat2
row1 0     one      four
     1     two      five
     2   three       six
row2 0     ten    twelve
     1  eleven  thirteen

还有一种选项可以使用Panel.to_frame(filter_observations=False)创建分层索引的DataFrame - Phillip Cloud
谢谢Jeff。这样做的想法是因为我需要将这些数据框与另一组标量值合并。例如,行1:DF_a,np.nan,104,105 | 行2:np.nan,DF_b,234,213。假设我有Cat1、Cat2、Scalar1、Scalar2列。我猜这仍然可以使用多索引方法,我只需要在cat1/cat2的所有项目上广播标量值即可?再次感谢。 - jorge.santos
你不需要那么花哨,只需使用“df['scalar1'] = 234”即可。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接