我有一个大型数据框,其中包含超过一百万条记录。我想根据客户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
最佳答案
由于您没有提供任何数据,因此我将尝试为您提供我未测试过的答案。
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
关于python - 分割 Pandas 数据框的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49292383/