我有一个包含1M +行的数据框。数据框的示例如下所示:
df
ID Type File
0 123 Phone 1
1 122 Computer 2
2 126 Computer 1
我想根据类型和文件分割此数据框。如果Type的总数为2(电话和计算机),文件总数为2(1,2),则拆分总数为4。
简而言之,总分割数如下:
total_splits=len(set(df['Type']))*len(set(df['File']))
在此示例中,total_splits = 4。现在,我想根据类型和文件将数据帧df分成4个。
因此,新数据框应为:
拆分应在循环内完成。
我知道我们可以根据一个条件分割数据帧(如下所示),但是如何基于两个条件分割数据帧呢?
我的代码:
data = {'ID' : ['123', '122', '126'],'Type' :['Phone','Computer','Computer'],'File' : [1,2,1]}
df=pd.DataFrame(data)
types=list(set(df['Type']))
total_splits=len(set(df['Type']))*len(set(df['File']))
cnt=1
for i in range(0,total_splits):
for j in types:
locals()["df"+str(cnt)] = df[df['Type'] == j]
cnt += 1
以上代码的结果给出了2个数据帧df1和df2。 df1的数据类型为“电话”,而df2的数据类型为“计算机”。
但这只是我想做的一半。有没有一种方法可以根据2个条件在此处制作4个数据帧?
注意:我知道我可以先拆分“类型”,然后再基于“文件”拆分结果数据框以获取输出。但是,我想知道执行拆分的更有效方法,而不必创建多个数据框来完成工作。
编辑
这不是重复的问题,因为我想基于多个列值(而不只是一个列)来拆分数据框!
答案 0 :(得分:1)
您可以使用groupby
:
dfs = {}
for k, d in df.groupby(['Type','File']):
type, file = k
# do want ever you want here
# d is the dataframe corresponding with type, file
dfs[k] = d
您还可以创建遮罩:
df['mask'] = df['File'].eq(1) * 2 + df['Type'].eq('Phone')
然后,例如:
df[df['mask'].eq(0)]
为您提供所需的第一个数据帧,即Type==Phone
和File==1
,依此类推。