我有这种dataFrame,我想将其拆分为单独的数据帧:
A B C Mark
3 5 6 T
4 5 2 T
3 4 5 B
5 6 7 B
3 4 5 T
2 5 2 T
例如,上表应分为三个熊猫数据框。第一个数据帧将标记为“ T”的两行作为一个数据帧,第二个数据帧将标记为“ B”的接下来的两行与第三数据帧将标记为“ T”的最后两行。
df1
A B C Mark
3 5 6 T
4 5 2 T
df2
A B C Mark
3 4 5 B
5 6 7 B
df3
A B C Mark
3 4 5 T
2 5 2 T
答案 0 :(得分:1)
使用shift
和cumsum
创建具有连续计数器的DataFrames字典,并将groupby对象转换为元组,然后转换为字典:
dfs = dict(tuple(df.groupby(df['Mark'].ne(df['Mark'].shift()).cumsum())))
print (dfs)
{1: A B C Mark
0 3 5 6 T
1 4 5 2 T, 2: A B C Mark
2 3 4 5 B
3 5 6 7 B, 3: A B C Mark
4 3 4 5 T
5 2 5 2 T}
选择每个数据框:
print (dfs[1])
print (dfs[2])
print (dfs[3])
答案 1 :(得分:1)
创建如下字典:
frames = {}
for i, grp in df.groupby(df.Mark.ne(df.Mark.shift()).cumsum()):
frames.update([('df_'+str(i),grp)])
{'df_1': A B C Mark
0 3 5 6 T
1 4 5 2 T, 'df_2': A B C Mark
2 3 4 5 B
3 5 6 7 B, 'df_3': A B C Mark
4 3 4 5 T
5 2 5 2 T}
然后可以通过将所有df打印为:
进行测试。print(frames['df_1'])
A B C Mark
0 3 5 6 T
1 4 5 2 T
答案 2 :(得分:0)
针对给定帖子将其包装到np.array_split
中的另一种方法:
但是,np.array_split
返回一个DataFrame列表,因此您可以列出然后向下甚至遍历该列表。
>>> np.array_split(df, 3)
[ A B C Mark
0 3 5 6 T
1 4 5 2 T, A B C Mark
2 3 4 5 B
3 5 6 7 B, A B C Mark
4 3 4 5 T
5 2 5 2 T]
将它们列为单个dfs:
>>> df[0]
A B C Mark
0 3 5 6 T
1 4 5 2 T
>>> df[1]
A B C Mark
2 3 4 5 B
3 5 6 7 B
>>> df[2]
A B C Mark
4 3 4 5 T
5 2 5 2 T
或者您可以为其指定名称:
df1 = df[0]
df2 = df[1]
df2 = df[2]