分割pandas数据帧的有效方法

时间:2018-03-15 05:51:22

标签: python pandas

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

1 个答案:

答案 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