【问题标题】:python & pandas - Split large dataframe into multiple dataframes and plot diagramspython & pandas - 将大型数据框拆分为多个数据框和绘图
【发布时间】:2017-01-17 00:12:00
【问题描述】:

我的情况与this case 类似。我正在从事一个项目,该项目具有大约 50 万行的大型数据框。大约有 2000 名用户参与其中。(我通过 value_counts() 计算一个名为 NoUsager 的列得到这个数字)。

我想将数据框拆分为几个数组/数据框以便在之后进行绘图。 (几个表示每个用户的数组/数据框) 我得到了这样的用户列表:

df.sort_values(by='NoUsager',inplace=True)
df.set_index(keys=['NoUsager'],drop=False,inplace=True)
users = df['NoUsager'].unique().tolist()

我知道接下来是生成较小数据帧的循环,但我不知道如何实现它。我结合上面的代码并尝试了the case中的那个,但没有解决方案。

我该怎么处理它?


编辑

我想要数据框的直方图和箱线图。提供答案后,我已经有了所有NoUsager 的箱线图。但是对于大量数据,箱线图太小而无法阅读。所以我想用NoUsager 分割数据框并分别绘制它们。 我想要的图表:

  1. 箱线图,列=DureeService,作者=NoUsager
  2. 箱线图,column=DureeService,by='Weekday`
  3. 直方图,对于每个Weekday,by=DureeService

我希望这次能得到很好的解释。

数据类型:

          Weekday NoUsager Periods  Sens  DureeService
DataType   string  string  string string datetime.time

DataFrame 示例:

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 

而困扰我的是,这些数据都不是数字,所以每次都必须转换。

提前致谢!

【问题讨论】:

    标签: python pandas matplotlib dataframe split


    【解决方案1】:

    无需先排序。你可以用你原来的 DataFrame 试试这个:

    # 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
    

    在此之后,您可以通过以下方式调用特定 NoUsager 的 DataFrame:

    dictionary[target_NoUsager]
    

    希望这会有所帮助。


    编辑

    如果你想做箱线图,你试过了吗:

    df.boxplot(column='DureeService', by='NoUsager')
    

    直接?更多信息在这里:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.boxplot.html


    编辑

    如果您想要几个选定的“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')
    

    如果您想要选定“NoUsager”的直方图:

    df[target NoUsager].hist(column='DureeService')
    

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

    【讨论】:

    • 它只工作了一次,在nousager的第一个值之后就停止了。
    • 正如@Psidom 建议的那样,我认为“groupby”将是一种更简单的方法。不过,你能提供错误信息吗?
    • 我刚刚为箱线图添加了一行。如果您只需要这样做,则无需拆分 DataFrame。
    • 它适用于箱线图。是否可以用这个df直接绘制直方图?
    • 确实,箱线图不一定要拆分。但是有了这么多数据,图表太小了,无法解释任何统计数据。
    【解决方案2】:

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

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

    【讨论】:

    • 你能说得更具体点吗?我更新了有关绘图的信息。与k 有什么关系? NoUsager虽然是数字,但保存为string。所以我应该先把它们转换成数字?
    • g 只是一个数据框,它只包含一个唯一的NoUsager,而kg 的唯一NoUsager。你可以随心所欲地使用它,作为标题或标签等......这里只是一个数字,如果你不需要它,你可以忽略它。尝试一个小的数据框和print(g) 使用for 循环,你会明白我的意思。
    • @ch36r5s,请提供样本数据集。在这种情况下,SO 社区将能够为您编写一个工作(和测试)的 sn-p。 How to make good reproducible pandas examples
    • @Psidom 谢谢,我一直在寻找这个。不过,您可能希望将您的解释添加到您的 awnser 而不是在 cmets 中进行解释。
    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2019-10-09
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多