我有一个大型数据框,其中包含超过一百万条记录。我想根据客户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.qcutnp.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/

10-12 17:01
查看更多