我和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
并分别绘制它们。
我想要的图表:
DureeService
,by = NoUsager
DureeService
,by ='Weekday` 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
令我烦恼的是,这些数据都不是数字,因此每次都必须进行转换。
提前致谢!
答案 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的第一行就足够了。