Pandas 使用 groupby 填充
- 2025-03-04 08:27:00
- admin 原创
- 44
问题描述:
我正在尝试使用具有相似列值的行来插补/填充值。
例如,我有这个数据框:
one | two | three
1 1 10
1 1 nan
1 1 nan
1 2 nan
1 2 20
1 2 nan
1 3 nan
1 3 nan
我想使用相似的列one
和键,如果列不是完全为 nan,则从具有列“3”中的值的相似键的行中估算现有值。two
`three`
这是我想要的结果:
one | two | three
1 1 10
1 1 10
1 1 10
1 2 20
1 2 20
1 2 20
1 3 nan
1 3 nan
您可以看到键 1 和 3 不包含任何值,因为现有值不存在。
我曾尝试使用groupby
+ fillna()
:
df['three'] = df.groupby(['one','two'])['three'].fillna()
这给了我一个错误。
我尝试过正向填充,结果却很奇怪,它反而正向填充了第 2 列。我使用此代码进行正向填充。
df['three'] = df.groupby(['one','two'], sort=False)['three'].ffill()
解决方案 1:
如果每个组仅一个非 NaN 值,则每个组使用ffill
(前向填充)和bfill
(后向填充),因此apply
需要lambda
:
df['three'] = df.groupby(['one','two'], sort=False)['three']
.apply(lambda x: x.ffill().bfill())
print (df)
one two three
0 1 1 10.0
1 1 1 10.0
2 1 1 10.0
3 1 2 20.0
4 1 2 20.0
5 1 2 20.0
6 1 3 NaN
7 1 3 NaN
但是如果每个组有多个值并且需要NaN
用某个常量替换 - 例如mean
按组:
print (df)
one two three
0 1 1 10.0
1 1 1 40.0
2 1 1 NaN
3 1 2 NaN
4 1 2 20.0
5 1 2 NaN
6 1 3 NaN
7 1 3 NaN
df['three'] = df.groupby(['one','two'], sort=False)['three']
.apply(lambda x: x.fillna(x.mean()))
print (df)
one two three
0 1 1 10.0
1 1 1 40.0
2 1 1 25.0
3 1 2 20.0
4 1 2 20.0
5 1 2 20.0
6 1 3 NaN
7 1 3 NaN
解决方案 2:
您可以按缺少值的列对数据进行排序,然后按 groupby 和 forwardfill 进行排序:
df.sort_values('three', inplace=True)
df['three'] = df.groupby(['one','two'])['three'].ffill()
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD