Reputation: 95
Hello Data Scientist and Pandas Experts,
I need some help as I can’t get my data organized properly.
When using unstack in groupby it does not group the data in properly. Here is my dataframe:
data = [
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'aemp', 'Department': 'dep1'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'aemp', 'Department': 'dep1'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'bemp', 'Department': 'dep1'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'bemp', 'Department': 'dep1'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'cemp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'cemp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store1', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'eemp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'eemp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'femp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'eemp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'femp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'femp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'aemp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'aemp', 'Department': 'dep1'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'gemp', 'Department': 'dep2'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-05 00:00:00'), 'Employee': 'gemp', 'Department': 'dep2'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'gemp', 'Department': 'dep2'},\
{'Store': 'Store2', 'Date': pd.Timestamp('2020-08-09 00:00:00'), 'Employee': 'cemp', 'Department': 'dep2'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'eemp', 'Department': 'dep1'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-05 00:00:00'), 'Employee': 'eemp', 'Department': 'dep1'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'bemp', 'Department': 'dep1'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-05 00:00:00'), 'Employee': 'bemp', 'Department': 'dep1'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'bemp', 'Department': 'dep1'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-07 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'},\
{'Store': 'Store3', 'Date': pd.Timestamp('2020-08-01 00:00:00'), 'Employee': 'demp', 'Department': 'dep2'}]
df = pd.DataFrame(data)
I want to organize my output as follow:
Store Store1 Store2 Store3
Department dep1 dep2 dep1 dep2 dep1 dep2
Employee aemp bemp cemp demp aemp eemp femp cemp demp gemp bemp eemp demp
Date
2020-08-03 1.0 1.0 2.0 3.0 1.0 1.0 2.0 0.0 1.0 1.0 2.0 1.0 1.0
2020-08-10 1.0 1.0 0.0 4.0 1.0 2.0 1.0 1.0 2.0 1.0 1.0 1.0 1.0
I used following groupby expression (I don't know how to sort the frame by its level):
df = df.groupby([pd.Grouper(key='Date', freq='W-MON'), 'Store', 'Department', 'Employee'])\
.size().unstack(['Store', 'Department', 'Employee']).fillna(0)
Here is what I got the result when I used above groupby expression:
Store Store1 Store2 Store3 Store2
Department dep1 dep2 dep1 dep2 dep1 dep2 dep2
Employee aemp bemp cemp demp aemp eemp femp demp gemp bemp eemp demp cemp
Date
2020-08-03 1.0 1.0 2.0 3.0 1.0 1.0 2.0 1.0 1.0 2.0 1.0 1.0 0.0
2020-08-10 1.0 1.0 0.0 4.0 1.0 2.0 1.0 1.0 2.0 1.0 1.0 1.0 1.0
Please provide me your expert help on how I can solve and fix my output so everything group properly.
Thank You and really appreciate your help.
This is continuous of my previous blog: How to show only column with Values in Pandas Groupby
Upvotes: 1
Views: 97
Reputation: 16683
Almost there, you just need to:
.groupby
columns as it will unstack in order and date
needs to be at the end rather than the beginning ORRearranging .groupby
columns:
df = (df.groupby(['Store', 'Department', 'Employee', pd.Grouper(key='Date', freq='W-MON'), ])
.size()
.unstack(['Store', 'Department', 'Employee']).fillna(0))
OR sort by the index, prior to unstacking with sort_index()
:
df = (df.groupby([pd.Grouper(key='Date', freq='W-MON'), 'Store', 'Department', 'Employee'])
.size()
.sort_index(level=['Store', 'Department', 'Employee', 'Date'])
.unstack(['Store', 'Department', 'Employee']).fillna(0))
Out[1]:
Store Store1 Store2 Store3 \
Department dep1 dep2 dep1 dep2 dep1
Employee aemp bemp cemp demp aemp eemp femp cemp demp gemp bemp eemp
Date
2020-08-03 1.0 1.0 2.0 3.0 1.0 1.0 2.0 0.0 1.0 1.0 2.0 1.0
2020-08-10 1.0 1.0 0.0 4.0 1.0 2.0 1.0 1.0 1.0 2.0 1.0 1.0
Store
Department dep2
Employee demp
Date
2020-08-03 1.0
2020-08-10 1.0
Upvotes: 1