通过在一列中的两个值之间插值来填充表中的nan值,并分别计算中值



我有一个pandas DataFrame,如下所示:

| ID | x | y   | z   |
| -- | - | --- | --- |
|  1 | 0 | nan | 36  |
|  1 | 1 | 12  | nan |
|  1 | 2 | nan | 38  |
|  1 | 3 | 11  | 37  |
|  2 | 0 | nan | 37  |
|  2 | 1 | nan | 37  |
|  2 | 2 | nan | nan |
|  2 | 3 | nan | nan |

我现在想用以下方式填写每个ID的nan值:

  1. 如果给定ID的值存在,则在后续值之间插值(即:当查看ID 1时:z的值(在行x1中(就是我要查找的值。我有x0、x2和x3的z值,但缺少与x1对应的z值。I因此想要通过在行x0和x2中的z值之间插值来找到z的值(在x1的行中(
  2. 如果没有为ID给定任何值(即:ID 2的所有y值都是nan(,我想计算整个列的中值(即:所有ID的所有y值(,并用该中值填充nan值

结果应该是pandas DataFrame,其中所有nan值都由如上所述的方案填充。然而,我是熊猫的初学者,不知道如何解决这个问题来获得完整的DataFrame。

首先对列表中的列使用每组Series.interpolate,然后用DataFrame.fillna:中的中值替换缺失值

cols = ['y','z']
median = df[cols].median()
df[cols] = (df.groupby('ID')[cols].transform(lambda x: x.interpolate())
.fillna(median))
print (df)
ID  x     y     z
0   1  0  11.5  36.0
1   1  1  12.0  37.0
2   1  2  11.5  38.0
3   1  3  11.0  37.0
4   2  0  11.5  37.0
5   2  1  11.5  37.0
6   2  2  11.5  37.0
7   2  3  11.5  37.0

此外,如果需要在interpolation中指定limit_direction,请使用:

cols = ['y','z']
median = df[cols].median()
df[cols]= df.groupby('ID')[cols].transform(lambda x: x.interpolate(limit_direction='both'))
.fillna(median))
print (df)
ID  x     y     z
0   1  0  12.0  36.0
1   1  1  12.0  37.0
2   1  2  11.5  38.0
3   1  3  11.0  37.0
4   2  0  11.5  37.0
5   2  1  11.5  37.0
6   2  2  11.5  37.0
7   2  3  11.5  37.0

最新更新