我有一个包含超过百万条记录的大型数据框。我想根据客户ID将这个数据框分成四个块,所以我尝试了下面的脚本。
unique_customer=df['Customer'].unique()
n=len(unique_customer)
a=n/4
s1=a
s2=s1+a
s3=s2+a
s4=n
l1= unique_customer[:s1]
l2= unique_customer[s1:s2]
l3= unique_customer[s2:s3]
l4= unique_customer[s3:s4]
df1=df[df['Customer'].isin(l1)]
df2=df[df['Customer'].isin(l2)]
df3=df[df['Customer'].isin(l3)]
df4=df[df['Customer'].isin(l4)]
适用于较小的数据集。但是大型数据集需要很长时间。这个问题还有其他替代方法吗?
示例数据: 输入:
Customer val1
0 a1 112
1 a2 2
2 a1 11
3 a3 154
4 a4 76
5 a5 12
6 a2 6
7 a4 7
8 a6 33
9 a5 67
10 a3 121
11 a5 21
12 a5 77
13 a4 3
14 a7 21
15 a5 65
16 a6 98
17 a8 45
18 a9 12
输出: DF1
Customer val1
0 a1 112
1 a2 2
2 a1 11
6 a2 6
DF2
Customer val1
3 a3 154
4 a4 76
7 a4 7
10 a3 121
13 a4 3
DF3
Customer val1
5 a5 12
8 a6 33
9 a5 67
11 a5 21
12 a5 77
15 a5 65
16 a6 98
DF4
Customer val1
14 a7 21
17 a8 45
18 a9 12
答案 0 :(得分:2)
由于您没有提供任何数据,我会尝试给您一个我未经过测试的答案。
groups = df.groupby('Customer').ngroup() % 4
df1, df2, df3, df4 = (g for _, g in df.groupby(groups))
虽然上述方法有效,但为了匹配您的输出,我必须在pd.qcut
上使用np.arange
来获取唯一的群组数。
f, u = pd.factorize(df['Customer'])
q, b = pd.qcut(np.arange(len(u)), 4, retbins=True)
b[-1] += 1
groups = pd.cut(f, b, labels=False, right=False)
df1, df2, df3, df4 = (g for _, g in df.groupby(groups))
print(df1, df2, df3, df4, sep='\n'*2)
Customer val1
0 a1 112
1 a2 2
2 a1 11
6 a2 6
Customer val1
3 a3 154
4 a4 76
7 a4 7
10 a3 121
13 a4 3
Customer val1
5 a5 12
8 a6 33
9 a5 67
11 a5 21
12 a5 77
15 a5 65
16 a6 98
Customer val1
14 a7 21
17 a8 45
18 a9 12