【问题标题】:Dividing a pandas groupby object into chunks将熊猫 groupby 对象分成块
【发布时间】:2019-03-20 00:57:09
【问题描述】:

我有一个 pandas DataFrame,我按列 ['client'、'product'、'data'] 进行分组。

grouped_data = raw_data.groupby(['client', 'product', 'data'])
print(len(grouped_data))
# 10000

我想将生成的 groupby 对象分成两个块,一个包含大约 80% 的组,另一个包含其余的组。

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

【问题讨论】:

  • 是 80% 的分组数据,还是你想将每个组分成两个,一个 80%,另一个 20%
  • groupby 已经将它们划分为等于data 列中唯一数据的块
  • 我需要 8000 个组和 2000 个组作为最终结果。
  • 是基于某种条件还是任意分割?

标签: pandas pandas-groupby


【解决方案1】:

你可以按照以下方式做一些事情:

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

chunk2 会产生:

     Client   Product   Data
3   Client4  ProductA  Data2
12  Client4  ProductA  Data2

    Client   Product   Data
4  Client5  ProductB  Data1
9  Client5  ProductA  Data2

【讨论】:

    【解决方案2】:

    通过使用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)]
    

    【讨论】:

    • 这很好,虽然我更喜欢df.set_index([...]).index 来定义组。我认为它比apply + tuple 更快。
    • @jpp 我也是这么想的,也许使用list + map可以提高速度
    • 您提出的解决方案很有效。其他版本大致看起来如何?
    猜你喜欢
    • 2019-02-24
    • 2016-10-31
    • 2021-12-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多