Pandas 将groupby对象划分为块
我有一个pandas数据框,我正在按列['client'、'product'、'data'分组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')
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
可以提高速度。您提出的解决方案效果不错。另一个版本大致上看起来如何?