Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧中生成行以弥补一列(或多列)缺少的值_Python_Pandas_Dataframe - Fatal编程技术网

Python 在数据帧中生成行以弥补一列(或多列)缺少的值

Python 在数据帧中生成行以弥补一列(或多列)缺少的值,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧 hour sensor_id hourly_count 0 1 101 651 1 1 102 19 2 2 101 423 3 2 102 12 4 3 101 356 5 4 101 79 6 4 102

我有以下数据帧

   hour sensor_id hourly_count 
0     1       101          651
1     1       102           19
2     2       101          423
3     2       102           12
4     3       101          356
5     4       101           79
6     4       102           21
7     5       101          129
8     6       101          561

请注意,对于传感器_id 102,没有小时=3的值。这是因为,如果每小时的_计数等于零,传感器不会生成单独的数据行。这意味着传感器102在小时=3时的小时计数应为0,但这只是收集原始数据的方式

理想情况下,我希望有一个代码来填补这个空白。因此,它应该理解,如果有2个传感器,每个传感器应该有一个小时记录,如果没有,则在该传感器的数据帧中插入该小时的一行,并将该行的hourly_count列填充为0

   hour sensor_id hourly_count 
0     1       101          651
1     1       102           19
2     2       101          423
3     2       102           12
4     3       101          356
5     3       102            0
6     4       101           79
7     4       102           21
8     5       101          129
9     5       102            0
10    6       101          561
11    6       102            0


非常感谢您的帮助。

使用
pandas.DataFrame.pivot
,然后使用
reset\u index
取消堆栈:

new_df = df.pivot('sensor_id','hour', 'hourly_count').fillna(0).unstack().reset_index()
print(new_df)
输出:

    hour  sensor_id      0
0      1        101  651.0
1      1        102   19.0
2      2        101  423.0
3      2        102   12.0
4      3        101  356.0
5      3        102    0.0
6      4        101   79.0
7      4        102   21.0
8      5        101  129.0
9      5        102    0.0
10     6        101  561.0
11     6        102    0.0
    hour  sensor_id  hourly_count
0      1        101           651
1      1        102            19
2      2        101           423
3      2        102            12
4      3        101           356
5      3        102             0
6      4        101            79
7      4        102            21
8      5        101           129
9      5        102             0
10     6        101           561
11     6        102             0
12     7        101             0
13     7        102             0
14     8        101             0
15     8        102             0

假设missing仅在传感器id上
2。一种方法是,您只需创建一个新的
df
,其中包含
sensor\u id
1的所有小时数组合,然后将此新的
df
与原始
df
合并,以获得
小时数
和填充值

a = df.hour.unique()
Idf1 = pd.MultiIndex.from_product([a, [101, 102]]).to_frame(index=False, name=['hour', 'sensor_id'])

Out[157]:
    hour  sensor_id
0      1        101
1      1        102
2      2        101
3      2        102
4      3        101
5      3        102
6      4        101
7      4        102
8      5        101
9      5        102
10     6        101
11     6        102

df1.merge(df, on=['hour','sensor_id'], how='left').fillna(0)

Out[161]:
    hour  sensor_id  hourly_count
0      1        101         651.0
1      1        102          19.0
2      2        101         423.0
3      2        102          12.0
4      3        101         356.0
5      3        102           0.0
6      4        101          79.0
7      4        102          21.0
8      5        101         129.0
9      5        102           0.0
10     6        101         561.0
11     6        102           0.0

其他方式:使用带有填充值的
取消堆叠

df.set_index(['hour', 'sensor_id']).unstack(fill_value=0).stack().reset_index()

Out[171]:
    hour  sensor_id  hourly_count
0      1        101           651
1      1        102            19
2      2        101           423
3      2        102            12
4      3        101           356
5      3        102             0
6      4        101            79
7      4        102            21
8      5        101           129
9      5        102             0
10     6        101           561
11     6        102             0

使用
DataFrame.reindex
,可以显式定义索引。如果在特定的一个小时内,两个传感器都缺少数据,这将非常有用。你也可以把时间延长到你拥有的时间之外。在下面的示例中,时间延长到8小时

new_ix = pd.MultiIndex.from_product([range(1,9), [101, 102]], names=['hour', 'sensor_id'])
df_new = df.set_index(['hour', 'sensor_id'])
df_new.reindex(new_ix, fill_value=0).reset_index()
输出:

    hour  sensor_id      0
0      1        101  651.0
1      1        102   19.0
2      2        101  423.0
3      2        102   12.0
4      3        101  356.0
5      3        102    0.0
6      4        101   79.0
7      4        102   21.0
8      5        101  129.0
9      5        102    0.0
10     6        101  561.0
11     6        102    0.0
    hour  sensor_id  hourly_count
0      1        101           651
1      1        102            19
2      2        101           423
3      2        102            12
4      3        101           356
5      3        102             0
6      4        101            79
7      4        102            21
8      5        101           129
9      5        102             0
10     6        101           561
11     6        102             0
12     7        101             0
13     7        102             0
14     8        101             0
15     8        102             0