Python熊猫数据框拆分

时间:2019-02-14 11:40:36

标签: python pandas dataframe

我有这种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

3 个答案:

答案 0 :(得分:1)

使用shiftcumsum创建具有连续计数器的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]