Python 将数据帧数组转换为单个数据帧
TLDR:我不知道如何获取数据帧数组并围绕它构建多索引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
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将适当地连接两个具有相同级别数的索引的数据帧