蟒蛇& pandas - 将大型数据框拆分为多个数据框和情节图

时间:2016-09-08 23:10:00

标签: python pandas matplotlib dataframe split

我和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. boxplot,column = DureeService,by = NoUsager
  2. boxplot,column = DureeService,by ='Weekday`
  3. 直方图,每Weekday,by = DureeService
  4. 我希望这次能得到很好的解释。

    数据类型:

              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 
    

    令我烦恼的是,这些数据都不是数字,因此每次都必须进行转换。

    提前致谢!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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的第一行就足够了。