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