如何根据数据框中的列值将值单独分组
我有一个熊猫数据框(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