【问题标题】:add missing values in pandas dataframe - datacleaning在熊猫数据框中添加缺失值 - 数据清理
【发布时间】:2022-01-13 05:07:25
【问题描述】:

我将测量值​​存储在如下所示的数据框中。 这些是 PM 的测量值。传感器在 x1..x56 条件下测量柱指示器中包含的 pm1、pm2.5、pm5、pm10 中的四个,并给出柱面积和计数的测量值。问题是在某些情况下(列 x1..x56)传感器没有捕获所有 PM。而且我希望列条件(x1..x56)的每个组合都在列指示器中包含所有 4 个 PM 值。如果传感器没有捕捉到它(如果 Xs 的某种组合没有 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

我该怎么做?提前致谢!

【问题讨论】:

  • 请提供可重复的示例。另外,如果有帮助,请查看此answer
  • 反之亦然吗?对于每个pmxx,您是否需要所有xs 组合?

标签: pandas data-cleaning


【解决方案1】:

这里的关键是从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

【讨论】:

  • 好的,谢谢!!但是如果 X 列是字符串,如何解决第 3 步
  • 我不认为它会改变。我创建了 X 列的所有值的元组。您遇到问题了吗?
  • 是的,我的 X 列全为零
  • 你可以在你的帖子中附加这样的案例吗?
  • 刚刚做到了.. 谢谢!
猜你喜欢
  • 2017-07-29
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2020-06-06
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多