【问题标题】:Splitting groupby() in pandas into smaller groups and combining them将 pandas 中的 groupby() 拆分为更小的组并将它们组合起来
【发布时间】:2019-01-14 09:00:41
【问题描述】:
            city  temperature  windspeed   event
            day                                                 
            2017-01-01  new york           32          6    Rain
            2017-01-02  new york           36          7   Sunny
            2017-01-03  new york           28         12    Snow
            2017-01-04  new york           33          7   Sunny
            2017-01-05  new york           31          7    Rain
            2017-01-06  new york           33          5   Sunny
            2017-01-07  new york           27         12    Rain
            2017-01-08  new york           23          7  Rain
            2017-01-01    mumbai           90          5   Sunny
            2017-01-02    mumbai           85         12     Fog
            2017-01-03    mumbai           87         15     Fog
            2017-01-04    mumbai           92          5    Rain
            2017-01-05    mumbai           89          7   Sunny
            2017-01-06    mumbai           80         10     Fog
            2017-01-07    mumbai           85         9     Sunny
            2017-01-08    mumbai           89          8    Rain
            2017-01-01     paris           45         20   Sunny
            2017-01-02     paris           50         13  Cloudy
            2017-01-03     paris           54          8  Cloudy
            2017-01-04     paris           42         10  Cloudy
            2017-01-05     paris           43         20   Sunny
            2017-01-06     paris           48         4  Cloudy
            2017-01-07     paris           40          14  Rain
            2017-01-08     paris           42         15  Cloudy
            2017-01-09     paris           53         8  Sunny

以上为原始数据。

下面显示了使用 np.array_split(data, 4) 的结果。

            day city  temperature  windspeed  event                                                
            2017-01-01  new york           32          6    Rain
            2017-01-02  new york           36          7   Sunny
            2017-01-03  new york           28         12    Snow
            2017-01-04  new york           33          7   Sunny
            2017-01-05  new york           31          7    Rain
            2017-01-06  new york           33          5   Sunny
            2017-01-07  new york           27         12    Rain  

            day city  temperature  windspeed  event                                                    
            2017-01-08  new york           23          7  Rain
            2017-01-01    mumbai           90          5   Sunny
            2017-01-02    mumbai           85         12     Fog
            2017-01-03    mumbai           87         15     Fog
            2017-01-04    mumbai           92          5    Rain
            2017-01-05    mumbai           89          7   Sunny             
            day city  temperature  windspeed  event                                                  
            2017-01-06    mumbai           80         10     Fog
            2017-01-07    mumbai           85         9     Sunny
            2017-01-08    mumbai           89          8    Rain
            2017-01-01     paris           45         20   Sunny
            2017-01-02     paris           50         13  Cloudy
            2017-01-03     paris           54          8  Cloudy              
            day city  temperature  windspeed  event             
            2017-01-04     paris           42         10  Cloudy
            2017-01-05     paris           43         20   Sunny
            2017-01-06     paris           48         4  Cloudy
            2017-01-07     paris           40          14  Rain
            2017-01-08     paris           42         15  Cloudy
            2017-01-09     paris           53         8  Sunny

正如您在此处看到的,我正在尝试从原始数据创建 4 个组,确保每个组都包含所有城市。但是,通过使用 array.split(),它将数据分成 4 组,但它不包含所有城市。我希望每个小组都有孟买、巴黎和纽约。 我该怎么做?

意思是说,我想要达到的目标如下:

第一组:

            day city  temperature  windspeed  event                                                
            2017-01-01  new york           32          6   Rain
            2017-01-02  paris           50         13  Cloudy
            2017-01-02    mumbai           85         12    Fog, 
            2017-01-05  new york           31          7    Rain
            2017-01-06  new york           33          5   Sunny
            2017-01-05    mumbai           89          7   Sunny  
            2017-01-05     paris           43         20   Sunny

第 2 组:

            day city  temperature  windspeed  event                                                    
            2017-01-04  new york           33          7  Sunny
            2017-01-01    mumbai           90          5  Sunny
            2017-01-03  paris           54          8  Cloudy
            2017-01-07  new york           27         12    Rain 
            2017-01-06    mumbai           80         10     Fog
            2017-01-09     paris           53         8  Sunny

第三组:

            day city  temperature  windspeed  event         
            2017-01-02  new york           36          7  Sunny                                         
            2017-01-03  mumbai           87         15    Fog
            2017-01-01   paris           45         20  Sunny,   
            2017-01-08    mumbai           89          8    Rain
            2017-01-06     paris           48         4  Cloudy
            2017-01-07     paris           40          14  Rain

第四组:

            day city  temperature  windspeed  event             
            2017-01-03  new york           28         12   Snow,  
            2017-01-04  mumbai           92          5   Rain
            2017-01-07    mumbai           85         9     Sunny
            2017-01-04  paris           42         10  Cloudy
            2017-01-08     paris           42         15  Cloudy
            2017-01-08  new york           23          7  Rain

从预期结果可以看出,主要是所有组都包含每个主题。

我的想法是按城市对数据进行分组,然后从每个城市的数据框中,将数据分成 4 组,然后对于城市中的每个组,将数据组合起来得到 4 个最终组。

【问题讨论】:

  • 谢谢。只是想知道您对 jpp 的回答的评论。分组的唯一条件是四组包含三个城市吗?所以2017-01-03 | new york 是在第 1 组还是第 4 组都没有关系?
  • @gyx-hh 是的。但是如果每个组中每个城市的数量相同会更好。这意味着例如在第 1 组中,我更喜欢它有 3 个纽约、2 个孟买、2 个巴黎。而不是 5 个纽约、1 个孟买和 1 个巴黎。因为我的真实数据由2000多个数据组成

标签: python python-2.7 pandas grouping pandas-groupby


【解决方案1】:

这是我的处理方法。首先按daycity 对数据框进行排序:

df = df.sort_values(by=['day', 'city'])

接下来为您的数据帧找到 4 个组的均匀拆分 - 如果拆分不均匀,则最后一组将获得剩余的:

n = int(len(df)/4)
groups_n = np.cumsum([0, n, n, n, len(df)-(3*n)])
print(groups_n)
OUT >> array([ 0,  6, 12, 18, 25], dtype=int32)

groups_n 是每个组的 startend。所以Group 1 我会选df.iloc[0:6]Group 4 我会选df.iloc[18:25]

因此,您的数据框 4 组拆分中的最终字典 d 将是:

d = {}
for i in range(4):
    d[i+1] = df.iloc[groups_n[i]:groups_n[i+1]]

示例输出:第 1 组 (d[1])

            city      temperature  windspeed    event
day             
2017-01-01  mumbai    90           5            Sunny
2017-01-01  new york  32           6            Rain
2017-01-01  paris     45           20           Sunny
2017-01-02  mumbai    85           12           Fog
2017-01-02  new york  36           7            Sunny
2017-01-02  paris     50           13           Cloudy

第 4 组:(d[4])

            city       temperature  windspeed   event
day             
2017-01-07  mumbai     85           9           Sunny
2017-01-07  new york   27           12          Rain
2017-01-07  paris      40           14          Rain
2017-01-08  mumbai     89           8           Rain
2017-01-08  new york   23           7           Rain
2017-01-08  paris      42           15          Cloudy
2017-01-09  paris      53           8           Sunny

【讨论】:

  • @gyx-xh 我试过你的代码,但是,我从代码中得到的结果与使用 np.array_split(data, 4) 相同。它将所有城市组合在一起,一组中只有 1 或 2 个城市。
【解决方案2】:

您可以通过GroupBy + cumcount 创建一个帮助列来统计每个城市的出现次数。

然后使用dict + tuple 和另一个GroupBy 创建一个数据框字典,每个字典都包含每个城市的一次出现。

# add index column giving count of city occurrence
df['index'] = df.groupby('city').cumcount()

# create dictionary of dataframes
d = dict(tuple(df.groupby('index')))

结果:

print(d)

{0:                city  temperature  windspeed  event  index
 day                                                      
 2017-01-01  newyork           32          6   Rain      0
 2017-01-01   mumbai           90          5  Sunny      0
 2017-01-01    paris           45         20  Sunny      0,
 1:                city  temperature  windspeed   event  index
 day                                                       
 2017-01-02  newyork           36          7   Sunny      1
 2017-01-02   mumbai           85         12     Fog      1
 2017-01-02    paris           50         13  Cloudy      1,
 2:                city  temperature  windspeed   event  index
 day                                                       
 2017-01-03  newyork           28         12    Snow      2
 2017-01-03   mumbai           87         15     Fog      2
 2017-01-03    paris           54          8  Cloudy      2,
 3:                city  temperature  windspeed   event  index
 day                                                       
 2017-01-04  newyork           33          7   Sunny      3
 2017-01-04   mumbai           92          5    Rain      3
 2017-01-04    paris           42         10  Cloudy      3}

然后您可以通过d[0]d[1]d[2]d[3] 提取单个“组”。在这种特殊情况下,您可能希望改为按日期分组,即

d = {df_.index[0]: df_ for _, df_ in df.groupby('index')}

【讨论】:

  • 谢谢。结果有点像我想要的。但是,我在我的实际数据上进行了尝试,似乎对于这段代码,如果有超过 12 个数据,比如说 25 个数据,它将数据分成 9 组( 25/3 - 3 因为有 3 个不同的城市)。但是,如果我希望它只是 4 个组,那么代码是什么,所以组中是否有两个相同的城市并不重要,只要每个城市都在每个组中,如果每组都有奇数
  • @Lily,这不清楚。您是否需要确保每个数据框结果具有相同的行数。或者您可以将所有额外的数据帧添加到 4 号末尾吗?还是应该将它们随机添加到前 4 个组中?
  • 假设我有 25 个数据,只有 3 个不同的城市,我想分成 4 组,我想要 3 组 6 个数据,1 组 7 个数据(因为不可能将25个数据平均分成4组)
  • @Lily,好的,这有点牵扯。我看不到一个简单的解决方案。也许不接受这个答案,用一个更有代表性的例子让你的问题更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2020-12-21
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多