【问题标题】:Python pandas dataframe splittingPython pandas 数据帧拆分
【发布时间】:2023-04-02 21:16:01
【问题描述】:

我有这种数据框,我想将其拆分为单独的数据框:

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    另一种将其包装到给定帖子的np.array_split 中的方法: 但是,np.array_split 返回一个 DataFrames 列表,因此您可以列出然后向下甚至循环列表。

    结果:

    >>> 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]
    

    【讨论】:

    • 感谢您的回答。您建议的脚本在这种特殊情况下效果很好,就像在示例中一样。如果我有数百行并且不知道标记更改的确切频率怎么办。
    【解决方案2】:

    如下创建字典:

    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}
    

    然后您可以通过将所有 dfs 打印为:

    print(frames['df_1'])
    
       A  B  C Mark
    0  3  5  6    T
    1  4  5  2    T
    

    【讨论】:

    • 谢谢!我喜欢你的回答。在这里,我可以对每个字典进行不同的命名,等等。'df_T_to_B'。其实这也是我想要的。
    • 高兴@Abbos :)
    【解决方案3】:

    通过shiftcumsum创建具有连续计数器的DataFrame字典,并将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}
    

    选择每个DataFrame:

    print (dfs[1])
    print (dfs[2])
    print (dfs[3])
    

    【讨论】:

    • 感谢您的回答。这是非常好的和紧凑的脚本。这正是我想要的,但是有一些高级的东西让它有点难以理解。
    • @Abbos - 好的,只问我,我试着解释更多。
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多