在 pandas 数据框中添加缺失值 - 数据清理

add missing values in pandas dataframe - datacleaning

我将测量值​​存储在如下所示的数据框中。 这些是 PM 的测量值。传感器在 x1..x56 条件下测量列指示器中包含的 pm1、pm2.5、pm5、pm10 中的四个,并给出列面积和计数的测量值。问题是在某些情况下(x1..x56 列)传感器没有捕捉到所有 PM。我希望列条件 (x1..x56) 的每个组合都在列指示符中包含所有 4 个 PM 值。如果传感器没有捕捉到它(如果 X 的某些组合没有 PM 值)我应该添加它,并且面积和计数列应该为 0。

 x1     x2    x3    x4    x5   x6  .. x56    indicator    area    count
 0      0     0     0     0    0   ..  0      pm1           10      56
 0      0     0     0     0    0   ..  0      pm10          9        1
 0      0     0     0     0    0   ..  0      pm5           1       454
     .............................................
 1      0     0     0     0    0   .. 0      pm1            3        4
 ssl    ax    w     45b   g    g  .. gb     pm1            3        4
 1      wdf   sw   d78  b    fd   .. b      pm1            3        4

在这个例子中,对于全零的第一个组合,pm2.5 丢失了,所以我应该添加它并将它的面积和计数设为 0。第二个组合(以 1 开头的组合)类似。所以我的虚拟示例在完成后应该如下所示:

 x1     x2    x3    x4    x5   x6  .. x56    indicator    area    count
 0      0     0     0     0    0   ..  0      pm1           10      56
 0      0     0     0     0    0   ..  0      pm10          9        1
 0      0     0     0     0    0   ..  0      pm5           1       454
 0      0     0     0     0    0   ..  0      pm2.5         0        0
     .............................................
 1      0     0     0     0    0   .. 0      pm1            3        4
 1      0     0     0     0    0   .. 0      pm10           0        0
 1      0     0     0     0    0   .. 0      pm5            0        0
 1      0     0     0     0    0   .. 0      pm2.5          0        0
 ssl    ax    w     45b   g    g  .. gb     pm1             3        4
 ssl    ax    w     45b   g    g  .. gb     pm10            0        0
 ssl    ax    w     45b   g    g  .. gb     pm5             0        0
 ssl    ax    w     45b   g    g  .. gb     pm2.5           0        0

 1      wdf   sw   d78  b    fd   .. b      pm1            3        4
 1      wdf   sw   d78  b    fd   .. b      pm10           0        0
 1      wdf   sw   d78  b    fd   .. b      pm5            0        0
 1      wdf   sw   d78  b    fd   .. b      pm2.5          0        0

我该怎么做?提前致谢!

这里的关键是根据 xindicator 的所有组合创建一个 MultiIndex,然后填充缺失的记录。

步骤 1. 创建一个包含 x 列的向量:

df['x'] = df.filter(regex='^x\d+').apply(tuple, axis=1)
print(df)

# Output:
   x1  x2  x3  x4  x5  x6  x56 indicator  area  count                      x
0   0   0   0   0   0   0    0       pm1    10     56  (0, 0, 0, 0, 0, 0, 0)
1   0   0   0   0   0   0    0      pm10     9      1  (0, 0, 0, 0, 0, 0, 0)
2   0   0   0   0   0   0    0       pm5     1    454  (0, 0, 0, 0, 0, 0, 0)
3   1   0   0   0   0   0    0       pm1     3      4  (1, 0, 0, 0, 0, 0, 0)

步骤 2. 从向量 xindicator 列表创建 MultiIindex,然后重新索引您的数据框。

mi = pd.MultiIndex.from_product([df['x'].unique(),
                                ['pm1', 'pm2.5', 'pm5', 'pm10']],
                                names=['x', 'indicator'])
out = df.set_index(['x', 'indicator']).reindex(mi, fill_value=0)
print(out)

# Output:
                                 x1  x2  x3  x4  x5  x6  x56  area  count
x                     indicator                                          
(0, 0, 0, 0, 0, 0, 0) pm1         0   0   0   0   0   0    0    10     56
                      pm2.5       0   0   0   0   0   0    0     0      0
                      pm5         0   0   0   0   0   0    0     1    454
                      pm10        0   0   0   0   0   0    0     9      1
(1, 0, 0, 0, 0, 0, 0) pm1         1   0   0   0   0   0    0     3      4
                      pm2.5      *0*  0   0   0   0   0    0     0      0
                      pm5        *0*  0   0   0   0   0    0     0      0
                      pm10       *0*  0   0   0   0   0    0     0      0
#            Need to be fixed ----^

步骤 3.x 索引分组以更新 x 列,方法是保持组中每一列的最大值 (1 > 0)。

out = out.filter(regex='^x\d+').groupby(level='x') \
         .apply(lambda x: pd.Series(dict(zip(x.columns, x.name)))) \
         .join(out[['area', 'count']]).reset_index()[df.columns[:-1]]
print(out)

# Output:
   x1  x2  x3  x4  x5  x6  x56 indicator  area  count
0   0   0   0   0   0   0    0       pm1    10     56
1   0   0   0   0   0   0    0     pm2.5     0      0
2   0   0   0   0   0   0    0       pm5     1    454
3   0   0   0   0   0   0    0      pm10     9      1
4   1   0   0   0   0   0    0       pm1     3      4
5   1   0   0   0   0   0    0     pm2.5     0      0
6   1   0   0   0   0   0    0       pm5     0      0
7   1   0   0   0   0   0    0      pm10     0      0