我有一个如下所示的数据框:
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
有没有办法可以将它拆分成一个pandas数据帧列表,每个数据帧都有1行和相同的标题?我可以循环它,但是有更多的pythonic soln吗?
用例是:
with Pool(processes=5) as p:
p.starmap(parallel_func, list(single_row_of_dataframe))
答案 0 :(得分:5)
选项1
np.split
for i in np.arange(1, len(df))):
print(i, '\n')
y gdp cap
0 1 2 5
y gdp cap
1 2 3 9
y gdp cap
2 8 7 2
y gdp cap
3 3 4 7
y gdp cap
4 6 7 7
如果您的索引是单调的,您可以使用它来分割:
for i in np.split(df, df.index[1:]):
print(i, '\n')
请注意,np.split
的核心是循环实现,所以你并没有真正逃避迭代。
splits = np.split(df, df.index[1:])
选项2
循环df.index
并致电loc
:
splits = [df.loc[[i]] for i in df.index]
在此处的评论中充实讨论 - 如果您正在寻求进行某种并行化,请查看dask
数据帧。不要尝试使用Pool
实现自己的并行化,否则您实际上会遇到性能下降。
答案 1 :(得分:3)
或者您可以使用//
和groupby
,我将数据框拆分为3,您可以更改所需的数字
[df1 for _,df1 in df.groupby(np.arange(len(df))//3)]
Out[356]:
[ y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2, y gdp cap
3 3 4 7
4 6 7 7]