首页 > 解决方案 > 如何为列中的每个类别创建行?

问题描述

假设我有以下数据。就像我的孩子从下午 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.
| ----- | ----- | ----- |

显然,我有点需要它是自动的,所以我可以将它用于一些真实数据。所以我不能只插入一行。索引或值排序并不重要。

标签: pythonpandasdataframe

解决方案


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

推荐阅读