python - Unstack Groupby 没有使用 Pandas 将数据分组到正确的数据集中
问题描述
您好,数据科学家和 Pandas 专家,
我需要一些帮助,因为我无法正确组织我的数据。
在 groupby 中使用 unstack 时,它不会正确地将数据分组。这是我的数据框:
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)
我想按如下方式组织我的输出:
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
我使用了以下 groupby 表达式(我不知道如何按级别对框架进行排序):
df = df.groupby([pd.Grouper(key='Date', freq='W-MON'), 'Store', 'Department', 'Employee'])\
.size().unstack(['Store', 'Department', 'Employee']).fillna(0)
这是我使用上面的 groupby 表达式时得到的结果:
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
请向我提供您的专家帮助,了解如何解决和修复我的输出,以便所有内容都正确分组。
谢谢你,非常感谢你的帮助。
这是我之前博客的延续:如何在 Pandas Groupby 中仅显示带有值的列
解决方案
快到了,您只需要:
- 更改
.groupby
列的顺序,因为它将按顺序取消堆叠,并且date
需要位于末尾而不是开头或 - 您可以按索引排序,但在步骤 1 中正确重新排列可以避免您执行此额外步骤。
重新排列.groupby
列:
df = (df.groupby(['Store', 'Department', 'Employee', pd.Grouper(key='Date', freq='W-MON'), ])
.size()
.unstack(['Store', 'Department', 'Employee']).fillna(0))
或按索引排序,然后使用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
推荐阅读
- reactjs - 无法从库中导入反应组件
- wix - 如何在不使用 c# 的情况下使用 wix 安装程序将 .msi 安装到远程虚拟机
- jquery - jQuery比较表单输入数组,颜色差异
- reactjs - 滑动最近在 Chrome 移动设备上停止工作
- node.js - 如何将 Node.js 应用程序正确连接到 Cassandra 节点?
- python - 为什么dask不并行执行
- react-native - setState 在一个消耗大量内存的时间间隔内
- hadoop - java.lang.NoSuchMethodError:org.apache.hadoop.io.retry.RetryUtils.getDefaultRetryPolicy
- c++ - C++字符串变量问题(_ZNSt7_cxx1112)在动态链接库中找不到
- spring-boot - 角色未与用户对象一起从数据库中获取