如何根据数据框中的列值将值单独分组

2 投票
1 回答
40 浏览
提问于 2025-04-14 15:19

我有一个熊猫数据框(panda dataframe)。我需要根据某一列的值进行分组。

State   Dates      Sales_Amt
A       1/1/2023     123
A       2/1/2023     123
A       3/1/2023     321
A       4/1/2023     321
A       5/1/2023     123
A       6/1/2023     123
A       7/1/2023     123
B       1/1/2023     456
B       2/1/2023     456
B       3/1/2023     456
B       4/1/2023     789
B       5/1/2023     789
B       6/1/2023     789
B       7/1/2023     123
B       8/1/2023     123

不过,如果下一个组的值和之前分组的值相同,它就需要被单独分出来,作为一个新组。

State   Start_Dates  End_Dates   Sales_Amt
A       1/1/2023     2/1/2023       123
A       3/1/2023     4/1/2023       321
A       5/1/2023     7/1/2023       123 
B       1/1/2023     3/1/2023       456
B       4/1/2023     6/1/2023       789
B       7/1/2023     8/1/2023       123

我该如何得到上面的结果呢?

我试过下面的代码,但它只对组B有效,对组A却不行。

df = (df.groupby(['State','Sales_Amt'],group_keys=True)
        .agg(Start_Dates=('Dates', np.min), 
             End_Dates=('Dates', np.max))
        .sort_values(['State','Start_Dates','End_Dates'],ascending=True)
        .reset_index()
     )

1 个回答

1

你需要添加一个额外的分组器来把连续的值放在一起:

# ensure datetime
df['Dates'] = pd.to_datetime(df['Dates'])

# add a grouper for consecutive values
group = (df['Sales_Amt'].ne(df.groupby('State')['Sales_Amt'].shift())
         .cumsum().rename('g')
        )

# groupby your columns + this grouper
out = (df.groupby(['State', 'Sales_Amt', group], group_keys=True)
         .agg(Start_Dates=('Dates', np.min), 
              End_Dates=('Dates', np.max))
         .sort_values(['State','Start_Dates','End_Dates'],ascending=True)
         .reset_index()
         .drop(columns='g') # remove the extra grouper (optional)
      )

输出结果:

  State  Sales_Amt Start_Dates  End_Dates
0     A        123  2023-01-01 2023-02-01
1     A        321  2023-03-01 2023-04-01
2     A        123  2023-05-01 2023-07-01
3     B        456  2023-01-01 2023-03-01
4     B        789  2023-04-01 2023-06-01
5     B        123  2023-07-01 2023-08-01

撰写回答