我有一个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值:
- 如果给定ID的值存在,则在后续值之间插值(即:当查看ID 1时:z的值(在行x1中(就是我要查找的值。我有x0、x2和x3的z值,但缺少与x1对应的z值。I因此想要通过在行x0和x2中的z值之间插值来找到z的值(在x1的行中(
- 如果没有为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