python - 如何为列中的每个类别创建行?
问题描述
假设我有以下数据。就像我的孩子从下午 1 点到 3 点每小时打开冰箱多少次一样。
| ----- | ----- | ----- |
| Name | Hour | Open |
| ----- | ----- | ----- |
| Bob | 1 | 4 |
| ----- | ----- | ----- |
| Bob | 3 | 2 |
| ----- | ----- | ----- |
| Jane | 1 | 1 |
| ----- | ----- | ----- |
| Jane | 2 | 7 |
| ----- | ----- | ----- |
如果我用熊猫来称呼它,我该如何填补缺失的时间,以便我可以拥有以下数据框?
| ----- | ----- | ----- |
| Name | Hour | Open |
| ----- | ----- | ----- |
| Bob | 1 | 4 |
| ----- | ----- | ----- |
| Bob | 2 | None | <<-- New row with Null or 0 for 'Open' column.
| ----- | ----- | ----- |
| Bob | 3 | 2 |
| ----- | ----- | ----- |
| Jane | 1 | 1 |
| ----- | ----- | ----- |
| Jane | 2 | 7 |
| ----- | ----- | ----- |
| Jane | 3 | None | <<-- New row with Null or 0 for 'Open' column.
| ----- | ----- | ----- |
显然,我有点需要它是自动的,所以我可以将它用于一些真实数据。所以我不能只插入一行。索引或值排序并不重要。
解决方案
Idea 被DataFrame.reindex
以下创建的所有可能组合使用MultiIndex.from_product
:
mux = pd.MultiIndex.from_product([df['Name'].unique(),
range(1, df['Hour'].max() + 1)], names=['Name','Hour'])
df1 = (df.set_index(['Name','Hour'])
.reindex(mux)
.reset_index())
print (df1)
Name Hour Open
0 Bob 1 4.0
1 Bob 2 NaN
2 Bob 3 2.0
3 Jane 1 1.0
4 Jane 2 7.0
5 Jane 3 NaN
如果可以使用 pandas 0.24+,请使用Nullable Integer Data Type:
df1 = (df.set_index(['Name','Hour'])
.reindex(mux).astype('Int64')
.reset_index())
print (df1)
Name Hour Open
0 Bob 1 4
1 Bob 2 NaN
2 Bob 3 2
3 Jane 1 1
4 Jane 2 7
5 Jane 3 NaN
并为替换不存在的值0
添加fill_value
参数:
df1 = (df.set_index(['Name','Hour'])
.reindex(mux, fill_value=0)
.reset_index())
print (df1)
Name Hour Open
0 Bob 1 4
1 Bob 2 0
2 Bob 3 2
3 Jane 1 1
4 Jane 2 7
5 Jane 3 0
推荐阅读
- macros - 在方案中定义全局闭包的标准方法是什么?
- apache-flink - FLINK 中的 KeyBy(key1 or key2) 可以吗?
- python - 读取和操作 CSV 文件时遇到问题
- c# - 如何将多个任务设置为单个按钮
- javascript - 单击 jquery / javascript 后显示选项卡类
- android - 权限对话框打不开
- javascript - 从模板启动多个命名视图
- regex - 序列号输入的正则表达式模式
- graphql - DynamoDB 中的 AWS Amplify 转换日志 createdBy/updatedBy 用户可以吗?
- java - 属性名称以“set”开头时未映射的目标属性警告