Pandas 将groupby对象划分为块

Pandas 将groupby对象划分为块,pandas,pandas-groupby,Pandas,Pandas Groupby,我有一个pandas数据框,我正在按列['client'、'product'、'data'分组 grouped_data = raw_data.groupby(['client', 'product', 'data']) print(len(grouped_data)) # 10000 我想将生成的groupby对象分成两个块,一个包含大约80%的组,另一个包含其余的组 我的头撞在屏幕上已经有一段时间了…你可以做一些如下的事情: grouped = df.groupby('Client')

我有一个pandas数据框,我正在按列['client'、'product'、'data'分组

grouped_data = raw_data.groupby(['client', 'product', 'data'])
print(len(grouped_data))
# 10000
我想将生成的groupby对象分成两个块,一个包含大约80%的组,另一个包含其余的组


我的头撞在屏幕上已经有一段时间了…

你可以做一些如下的事情:

grouped = df.groupby('Client')

bound = int(np.ceil(len(grouped)*0.8))-1

chunk1 = [g[1] for g in list(grouped)[:bound]]
chunk2 = [g[1] for g in list(grouped)[bound:]]
对于以下示例数据帧:

     Client   Product   Data
0   Client1  ProductA  Data1
1   Client2  ProductA  Data3
2   Client3  ProductB  Data1
3   Client4  ProductA  Data2
4   Client5  ProductB  Data1
5   Client2  ProductA  Data1
6   Client3  ProductA  Data3
7   Client2  ProductB  Data1
8   Client3  ProductB  Data1
9   Client5  ProductA  Data2
10  Client1  ProductA  Data1
11  Client1  ProductB  Data1
12  Client4  ProductA  Data2
13  Client3  ProductB  Data2
14  Client2  ProductB  Data3
chunk1
将产生:

     Client   Product   Data
0   Client1  ProductA  Data1
10  Client1  ProductA  Data1
11  Client1  ProductB  Data1

     Client   Product   Data
1   Client2  ProductA  Data3
5   Client2  ProductA  Data1
7   Client2  ProductB  Data1
14  Client2  ProductB  Data3

     Client   Product   Data
2   Client3  ProductB  Data1
6   Client3  ProductA  Data3
8   Client3  ProductB  Data1
13  Client3  ProductB  Data2
     Client   Product   Data
3   Client4  ProductA  Data2
12  Client4  ProductA  Data2

    Client   Product   Data
4  Client5  ProductB  Data1
9  Client5  ProductA  Data2
chunk2
将产生:

     Client   Product   Data
0   Client1  ProductA  Data1
10  Client1  ProductA  Data1
11  Client1  ProductB  Data1

     Client   Product   Data
1   Client2  ProductA  Data3
5   Client2  ProductA  Data1
7   Client2  ProductB  Data1
14  Client2  ProductB  Data3

     Client   Product   Data
2   Client3  ProductB  Data1
6   Client3  ProductA  Data3
8   Client3  ProductB  Data1
13  Client3  ProductB  Data2
     Client   Product   Data
3   Client4  ProductA  Data2
12  Client4  ProductA  Data2

    Client   Product   Data
4  Client5  ProductB  Data1
9  Client5  ProductA  Data2

您可以按照以下思路做一些事情:

grouped = df.groupby('Client')

bound = int(np.ceil(len(grouped)*0.8))-1

chunk1 = [g[1] for g in list(grouped)[:bound]]
chunk2 = [g[1] for g in list(grouped)[bound:]]
对于以下示例数据帧:

     Client   Product   Data
0   Client1  ProductA  Data1
1   Client2  ProductA  Data3
2   Client3  ProductB  Data1
3   Client4  ProductA  Data2
4   Client5  ProductB  Data1
5   Client2  ProductA  Data1
6   Client3  ProductA  Data3
7   Client2  ProductB  Data1
8   Client3  ProductB  Data1
9   Client5  ProductA  Data2
10  Client1  ProductA  Data1
11  Client1  ProductB  Data1
12  Client4  ProductA  Data2
13  Client3  ProductB  Data2
14  Client2  ProductB  Data3
chunk1
将产生:

     Client   Product   Data
0   Client1  ProductA  Data1
10  Client1  ProductA  Data1
11  Client1  ProductB  Data1

     Client   Product   Data
1   Client2  ProductA  Data3
5   Client2  ProductA  Data1
7   Client2  ProductB  Data1
14  Client2  ProductB  Data3

     Client   Product   Data
2   Client3  ProductB  Data1
6   Client3  ProductA  Data3
8   Client3  ProductB  Data1
13  Client3  ProductB  Data2
     Client   Product   Data
3   Client4  ProductA  Data2
12  Client4  ProductA  Data2

    Client   Product   Data
4  Client5  ProductB  Data1
9  Client5  ProductA  Data2
chunk2
将产生:

     Client   Product   Data
0   Client1  ProductA  Data1
10  Client1  ProductA  Data1
11  Client1  ProductB  Data1

     Client   Product   Data
1   Client2  ProductA  Data3
5   Client2  ProductA  Data1
7   Client2  ProductB  Data1
14  Client2  ProductB  Data3

     Client   Product   Data
2   Client3  ProductB  Data1
6   Client3  ProductA  Data3
8   Client3  ProductB  Data1
13  Client3  ProductB  Data2
     Client   Product   Data
3   Client4  ProductA  Data2
12  Client4  ProductA  Data2

    Client   Product   Data
4  Client5  ProductB  Data1
9  Client5  ProductA  Data2

使用
np.split

df['key']=df[['client', 'product', 'data']].apply(tuple,1)

g1,g2=np.split(df['key'].unique(),[2000])

df1=df[df['key'].isin(g1)]

df2=df[df['key'].isin(g2)]

使用
np.split

df['key']=df[['client', 'product', 'data']].apply(tuple,1)

g1,g2=np.split(df['key'].unique(),[2000])

df1=df[df['key'].isin(g1)]

df2=df[df['key'].isin(g2)]

它是80%的分组数据,还是您希望将其拆分为两个的每个组—一个是80%,另一个是20%
groupby
将它们划分为与列
data
中的唯一数据相等的块—我需要8000个组和2000个组作为最终结果。根据某些条件或任意划分,可能会重复?是80%的分组数据,或者,您要将其拆分为两个组,一个是80%,另一个是20%
groupby
将它们拆分为与列
data
中的唯一数据相等的块。我需要8000个组和2000个组作为最终结果。基于某些条件或任意划分,可能会重复?这很好,尽管我更喜欢
df.set_index([…]).index
用于定义组。我认为它比
apply
+
tuple
@jpp更快。我也认为,也许使用
list+map
可以提高速度。您提出的解决方案效果不错。另一个版本大致看起来如何?这很好,不过我更喜欢用
df.set_index([…]).index
来定义组。我认为它比
apply
+
tuple
@jpp更快。我也认为,也许使用
list+map
可以提高速度。您提出的解决方案效果不错。另一个版本大致上看起来如何?