python&;pandas-将大型数据帧拆分为多个数据帧和绘图图

python&;pandas-将大型数据帧拆分为多个数据帧和绘图图,python,pandas,matplotlib,dataframe,split,Python,Pandas,Matplotlib,Dataframe,Split,我和你的情况相似。我正在做一个项目,它有一个大约50万行的大型数据框。大约有2000名用户参与了这项工作。(我通过计算一个名为NoUsager的列得到这个数字) 我想将数据框拆分为几个数组/数据框,以便在以后打印。(多个表示每个用户的阵列/数据帧) 我得到了如下用户列表: df.sort_values(by='NoUsager',inplace=True) df.set_index(keys=['NoUsager'],drop=False,inplace=True) users = df['No

我和你的情况相似。我正在做一个项目,它有一个大约50万行的大型数据框。大约有2000名用户参与了这项工作。(我通过计算一个名为
NoUsager
的列得到这个数字)

我想将数据框拆分为几个数组/数据框,以便在以后打印。(多个表示每个用户的阵列/数据帧) 我得到了如下用户列表:

df.sort_values(by='NoUsager',inplace=True)
df.set_index(keys=['NoUsager'],drop=False,inplace=True)
users = df['NoUsager'].unique().tolist()
我知道接下来要做的是生成较小数据帧的循环,但我不知道如何实现。我结合了上面的代码,尝试了其中的一个,但没有解决方案

我该怎么处理它呢


编辑

我想要数据帧的直方图和箱线图。根据提供的答案,我已经有了所有
NoUsager
的方框图。但由于数据量大,箱线图太小,无法读取。因此,我想按
NoUsager
分割数据帧,并分别绘制它们。 我想要的图表:

  • 箱线图,列=
    DureeService
    ,by=
    NoUsager
  • 箱线图,列=
    DureeService
    ,按='Weekday`
  • 直方图,对于每个
    工作日
    ,按=
    DureeService
  • 我希望这次能解释清楚

    数据类型:

              Weekday NoUsager Periods  Sens  DureeService
    DataType   string  string  string string datetime.time
    
    数据帧示例:

    Weekday NoUsager Periods Sens DureeService
    Lun 000001 Matin + 00:00:05 
    Lun 000001 Matin + 00:00:04 
    Mer 000001 Matin + 00:00:07 
    Dim 000001 Soir  - 00:00:02 
    Lun 000001 Matin + 00:00:07 
    Jeu 000001 Soir  - 00:00:04 
    Lun 000001 Matin + 00:00:07 
    Lun 000001 Soir  - 00:00:04 
    Dim 000001 Matin + 00:00:05 
    Lun 000001 Matin + 00:00:03 
    Mer 000001 Matin + 00:00:04 
    Ven 000001 Soir  - 00:00:03 
    Mar 000001 Matin + 00:00:03 
    Lun 000001 Soir  - 00:00:04 
    Lun 000001 Matin + 00:00:04 
    Mer 000002 Soir  - 00:00:04 
    Jeu 000003 Matin + 00:00:50 
    Mer 000003 Soir  - 00:06:51 
    Mer 000003 Soir  - 00:00:08 
    Mer 000003 Soir  - 00:00:10 
    Jeu 000003 Matin + 00:12:35 
    Lun 000004 Matin + 00:00:05 
    Dim 000004 Matin + 00:00:05 
    Lun 000004 Matin + 00:00:05 
    Lun 000004 Matin + 00:00:05 
    
    # import third-party libraries
    import pandas as pd
    import numpy as np
    # Define a function takes the database, and return a dictionary
    def splitting_dataframe(df):
        d = {}                                   # Define an empty dictionary
        nousager = np.unique(df.NoUsager.values) # Getting the NoUsage list
        for NU in nousager:                      # Loop over NoUsage list
            d[NU] = df[df.NoUsager == NU]        # I guess this line is what you want most
        return d                                 # Return the dictionary
    dictionary = splitting_dataframe(df)  # Calling the function
    

    让我烦恼的是这些数据都不是数字,所以每次都要转换


    提前谢谢

    无需先排序。您可以使用原始数据帧尝试以下操作:

    Weekday NoUsager Periods Sens DureeService
    Lun 000001 Matin + 00:00:05 
    Lun 000001 Matin + 00:00:04 
    Mer 000001 Matin + 00:00:07 
    Dim 000001 Soir  - 00:00:02 
    Lun 000001 Matin + 00:00:07 
    Jeu 000001 Soir  - 00:00:04 
    Lun 000001 Matin + 00:00:07 
    Lun 000001 Soir  - 00:00:04 
    Dim 000001 Matin + 00:00:05 
    Lun 000001 Matin + 00:00:03 
    Mer 000001 Matin + 00:00:04 
    Ven 000001 Soir  - 00:00:03 
    Mar 000001 Matin + 00:00:03 
    Lun 000001 Soir  - 00:00:04 
    Lun 000001 Matin + 00:00:04 
    Mer 000002 Soir  - 00:00:04 
    Jeu 000003 Matin + 00:00:50 
    Mer 000003 Soir  - 00:06:51 
    Mer 000003 Soir  - 00:00:08 
    Mer 000003 Soir  - 00:00:10 
    Jeu 000003 Matin + 00:12:35 
    Lun 000004 Matin + 00:00:05 
    Dim 000004 Matin + 00:00:05 
    Lun 000004 Matin + 00:00:05 
    Lun 000004 Matin + 00:00:05 
    
    # import third-party libraries
    import pandas as pd
    import numpy as np
    # Define a function takes the database, and return a dictionary
    def splitting_dataframe(df):
        d = {}                                   # Define an empty dictionary
        nousager = np.unique(df.NoUsager.values) # Getting the NoUsage list
        for NU in nousager:                      # Loop over NoUsage list
            d[NU] = df[df.NoUsager == NU]        # I guess this line is what you want most
        return d                                 # Return the dictionary
    dictionary = splitting_dataframe(df)  # Calling the function
    
    在此之后,您可以通过以下方式调用特定本体的数据帧:

    dictionary[target_NoUsager]
    
    希望这有帮助


    编辑 如果要进行长方体打印,是否尝试过:

    df.boxplot(column='DureeService', by='NoUsager')
    
    直接的?更多信息请点击此处:


    编辑 如果要为几个选定的“本体”绘制箱线图:

    targets = [some selected NoUsagers]
    mask = np.sum([df.A.values == targets[i] for i in xrange(len(targets))], dtype=bool, axis=0)
    df[mask].boxplot(column='DureeService', by='NoUsager')
    
    df[target NoUsager].hist(column='DureeService')
    
    如果您想要选定“本体”的直方图:

    targets = [some selected NoUsagers]
    mask = np.sum([df.A.values == targets[i] for i in xrange(len(targets))], dtype=bool, axis=0)
    df[mask].boxplot(column='DureeService', by='NoUsager')
    
    df[target NoUsager].hist(column='DureeService')
    

    如果仍然需要将它们分开,@Psidom的第一行就足够了。

    无需先排序。您可以使用原始数据帧尝试以下操作:

    Weekday NoUsager Periods Sens DureeService
    Lun 000001 Matin + 00:00:05 
    Lun 000001 Matin + 00:00:04 
    Mer 000001 Matin + 00:00:07 
    Dim 000001 Soir  - 00:00:02 
    Lun 000001 Matin + 00:00:07 
    Jeu 000001 Soir  - 00:00:04 
    Lun 000001 Matin + 00:00:07 
    Lun 000001 Soir  - 00:00:04 
    Dim 000001 Matin + 00:00:05 
    Lun 000001 Matin + 00:00:03 
    Mer 000001 Matin + 00:00:04 
    Ven 000001 Soir  - 00:00:03 
    Mar 000001 Matin + 00:00:03 
    Lun 000001 Soir  - 00:00:04 
    Lun 000001 Matin + 00:00:04 
    Mer 000002 Soir  - 00:00:04 
    Jeu 000003 Matin + 00:00:50 
    Mer 000003 Soir  - 00:06:51 
    Mer 000003 Soir  - 00:00:08 
    Mer 000003 Soir  - 00:00:10 
    Jeu 000003 Matin + 00:12:35 
    Lun 000004 Matin + 00:00:05 
    Dim 000004 Matin + 00:00:05 
    Lun 000004 Matin + 00:00:05 
    Lun 000004 Matin + 00:00:05 
    
    # import third-party libraries
    import pandas as pd
    import numpy as np
    # Define a function takes the database, and return a dictionary
    def splitting_dataframe(df):
        d = {}                                   # Define an empty dictionary
        nousager = np.unique(df.NoUsager.values) # Getting the NoUsage list
        for NU in nousager:                      # Loop over NoUsage list
            d[NU] = df[df.NoUsager == NU]        # I guess this line is what you want most
        return d                                 # Return the dictionary
    dictionary = splitting_dataframe(df)  # Calling the function
    
    在此之后,您可以通过以下方式调用特定本体的数据帧:

    dictionary[target_NoUsager]
    
    希望这有帮助


    编辑 如果要进行长方体打印,是否尝试过:

    df.boxplot(column='DureeService', by='NoUsager')
    
    直接的?更多信息请点击此处:


    编辑 如果要为几个选定的“本体”绘制箱线图:

    targets = [some selected NoUsagers]
    mask = np.sum([df.A.values == targets[i] for i in xrange(len(targets))], dtype=bool, axis=0)
    df[mask].boxplot(column='DureeService', by='NoUsager')
    
    df[target NoUsager].hist(column='DureeService')
    
    如果您想要选定“本体”的直方图:

    targets = [some selected NoUsagers]
    mask = np.sum([df.A.values == targets[i] for i in xrange(len(targets))], dtype=bool, axis=0)
    df[mask].boxplot(column='DureeService', by='NoUsager')
    
    df[target NoUsager].hist(column='DureeService')
    

    如果您仍然需要将它们分开,@Psidom的第一行就足够了。

    [g for g,g in df.groupby('NoUsager')]
    提供了一个数据帧列表,其中每个数据帧包含一个唯一的
    NoUsager
    。但我认为你需要的是:

    for k, g in df.groupby('NoUsager'):
        g.plot(kind = ..., x = ..., y = ...) etc..
    

    [g for g,在df.groupby('NoUsager')]
    提供了一个数据帧列表,其中每个数据帧包含一个唯一的
    NoUsager
    。但我认为你需要的是:

    for k, g in df.groupby('NoUsager'):
        g.plot(kind = ..., x = ..., y = ...) etc..
    

    它只工作了一次,在第一个值
    nousager
    之后就停止了。正如@Psidom所建议的,我认为“groupby”是一种更简单的方法。不过,您能提供错误消息吗?我刚刚为boxplot添加了一行。如果您只需要拆分数据帧,则无需拆分数据帧。它与boxplot一起工作。可以用这个df直接绘制柱状图吗?事实上,不一定要拆分为箱线图。但是有了这么多的数据,图表太小了,无法解释任何统计数据。它只工作了一次,在第一个值
    nousager
    之后就停止了。正如@Psidom所建议的,我认为“groupby”是一种更简单的方法。不过,您能提供错误消息吗?我刚刚为boxplot添加了一行。如果您只需要拆分数据帧,则无需拆分数据帧。它与boxplot一起工作。可以用这个df直接绘制柱状图吗?事实上,不一定要拆分为箱线图。但是有这么多的数据,图表太小了,无法解释任何统计数据。你能更具体一点吗?我更新了一些关于密谋的信息。如何处理
    k
    ?虽然
    NoUsager
    是数字,但它们保存为
    string
    。所以我应该先把它们转换成数字?
    g
    只是一个数据帧,它只包含一个唯一的
    NoUsager
    ,而
    k
    g
    的唯一
    NoUsager
    。你可以随意使用它,如标题或标签等。。。这只是一个数字,如果你不需要,你可以忽略它。尝试一个小数据框并使用
    for
    循环打印(g),您将了解我的意思。@ch36r5s,请提供一个示例数据集。在这种情况下,SO社区将能够为您编写一个工作(并经过测试)的代码段@谢谢,我已经找了一整天了。你可能想在你的awnser中添加你的解释,而不是在评论中解释。你能更具体一点吗?我更新了一些关于密谋的信息。如何处理
    k
    ?虽然
    NoUsager
    是数字,但它们保存为
    string
    。所以我应该先把它们转换成数字?
    g
    只是一个数据帧,它只包含一个唯一的
    NoUsager
    ,而
    k
    g
    的唯一
    NoUsager
    。你可以随意使用它,如标题或标签等。。。这只是一个数字,如果你不需要,你可以忽略它。尝试一个小数据框并使用
    for
    循环打印(g),您将了解我的意思。@ch36r5s,请提供一个示例数据集。在这种情况下,SO社区将能够为您编写一个工作(并经过测试)的代码段@谢谢,我已经找了一整天了。不过,您可能希望在awnser中添加您的解释,而不是在注释中解释。