python&;pandas-将大型数据帧拆分为多个数据帧和绘图图
我和你的情况相似。我正在做一个项目,它有一个大约50万行的大型数据框。大约有2000名用户参与了这项工作。(我通过计算一个名为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
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中添加您的解释,而不是在注释中解释。