Python 将数据帧数组转换为单个数据帧

Python 将数据帧数组转换为单个数据帧,python,python-2.7,pandas,multiprocessing,Python,Python 2.7,Pandas,Multiprocessing,TLDR:我不知道如何获取数据帧数组并围绕它构建多索引 rounds = range(0,1000) levels = [... some set of levels ...] labels = [... some set of labels ...] iterables = [rounds, labels, levels] names = ['round', 'label', 'values'] index = pd.MultiIndex.from_product(iterables, na

TLDR:我不知道如何获取数据帧数组并围绕它构建多索引

rounds = range(0,1000)
levels = [... some set of levels ...]
labels = [... some set of labels ...]
iterables = [rounds, labels, levels]

names = ['round', 'label', 'values']
index = pd.MultiIndex.from_product(iterables, names=names)

index_names = [... some set of index names...]
empty_df = pd.DataFrame(
              np.zeros_like(np.random.randn(5, 50000)),
              index=index_names,
              columns=index
             )
             .sort_index()
             .sort_index(axis=1)
TLDR 2:根据我的研究,建议处理返回结果,而不是尝试在
Pool().Map()中处理全局/单个/共享数据帧。如果有人有办法分享,我完全赞成


我正在尝试合并一个由。功能

p = Pool()
results = p.map(run_experiment, experiment_collection)
Pool().map()
作为数组返回。假设该进程返回包含1000个
数据帧的数组,第一个索引为
[0:5]
,第二个索引为
[0:50]

我想要的是创建一个最终输出,它是一个单独的数据帧,将每个实验分隔开来,因此
[0:1000]
/
[0:5]
/
[0:50]


我知道如何使用
np.zero\u创建多索引,然后填充数据帧,但我不知道如何获取数据帧数组并围绕它构建多索引

rounds = range(0,1000)
levels = [... some set of levels ...]
labels = [... some set of labels ...]
iterables = [rounds, labels, levels]

names = ['round', 'label', 'values']
index = pd.MultiIndex.from_product(iterables, names=names)

index_names = [... some set of index names...]
empty_df = pd.DataFrame(
              np.zeros_like(np.random.randn(5, 50000)),
              index=index_names,
              columns=index
             )
             .sort_index()
             .sort_index(axis=1)

在我的第一个示例中,
results
是一个
级别的多索引数据帧数组
/
标签
。我试图做的是创建一个最终的数据帧,它将顶层(一个包含所有这些数据帧的数组)替换为一个新的索引

当我尝试

p = Pool()
results = pd.DataFrame(
              p.map(run_experiment, experiment_collection),
              index=index_names,
              columns=index
             )
             .sort_index()
             .sort_index(axis=1)
我得到了
ValueError:传递值的形状是(1,1000),索引暗示(预期索引的形状)
,这是有意义的,因为它是一个包含1000个数据帧的数组

如果我连接(感觉这是更好的方式)

我得到了一个带有
级别
/
标签
的数据帧,但没有

iterables = [rounds, labels, levels]

我不确定我应该在这里操作哪些选项(键、级别、名称),以使我的
轮数回到数据帧中

results = pd.concat(
              p.map(run_experiment, experiment_collection),
              levels=iterables,
              names=names,
              axis=1
          )
使我非常接近我想要的格式,但没有

iterables = [rounds, labels, levels]


如果需要的话,我可以说得更具体一些,但不完全确定还有什么有助于得到答案。

由于没有更好的答案,我正在重新创建我的原始数据帧,并遍历从
Pool().Map()
返回的结果,将每个列表位置插入到数据帧中。似乎有更好的办法,但我想不起来

p = Pool()
results = p.map(run_experiment, experiment_collection)

final_df = pd.DataFrame(
            np.zeros_like(np.random.randn(5, 50000)),
            index=index_names,
            columns=index
           )
           .sort_index()
           .sort_index(axis=1)

for result in results:
  final_df[increment_value] = result

由于没有更好的答案,我正在重新创建我的原始数据帧,并遍历从
Pool().Map()
返回的结果,将每个列表位置插入到数据帧中。似乎有更好的办法,但我想不起来

p = Pool()
results = p.map(run_experiment, experiment_collection)

final_df = pd.DataFrame(
            np.zeros_like(np.random.randn(5, 50000)),
            index=index_names,
            columns=index
           )
           .sort_index()
           .sort_index(axis=1)

for result in results:
  final_df[increment_value] = result

有几种很好的方法可以做到这一点:

1) 如果从一组系列对象开始: 将series objects name参数设置为元组。然后使用pd.concat([series list],axis=1)

2) 如果您有数据帧的单级映射,那么可以使用pd.concat可以接受dict作为其第一个参数这一事实。例如

pd.concat({A:df1, B:df2}, axis=1)
将创建一个多级索引,其中a、B为顶级,df的列为第二级。虽然不能嵌套DICT,但可以多次这样做以构建任意深度的索引


3) 您可以在DF上使用Dataframe构造函数,但可以传递元组列表作为列名。E.f.如果您有一个带有a、B列的df,并且您使用df_new=pd.DataFrame(df,columns=[(“Foo”,“a”),(“Foo”,“B”)]),这将创建一个带有多级索引的新df,那么您可以对您的df单独执行此操作,然后连接它们。Pandas将使用相同级别数的索引适当地连接两个数据帧。

有几种很好的方法可以做到这一点:

1) 如果从一组系列对象开始: 将series objects name参数设置为元组。然后使用pd.concat([series list],axis=1)

2) 如果您有数据帧的单级映射,那么可以使用pd.concat可以接受dict作为其第一个参数这一事实。例如

pd.concat({A:df1, B:df2}, axis=1)
将创建一个多级索引,其中a、B为顶级,df的列为第二级。虽然不能嵌套DICT,但可以多次这样做以构建任意深度的索引

3) 您可以在DF上使用Dataframe构造函数,但可以传递元组列表作为列名。E.f.如果您有一个带有a、B列的df,并且您使用df_new=pd.DataFrame(df,columns=[(“Foo”,“a”),(“Foo”,“B”)]),这将创建一个带有多级索引的新df,那么您可以对您的df单独执行此操作,然后连接它们。Pandas将适当地连接两个具有相同级别数的索引的数据帧