python - iloc 条件分组由 pandas 填充
问题描述
尝试在数据框中有条件地填充 NaN,基于:
1. A 上的值(使用 groupby 完成)
2. 在 groupby(A) 内部,如果值为 nan 并且是第一个,则填充为零然后填充(例如 A=a )
3. 在 groupby(A) 内部,如果 value 是 nan 并且不是第一个,bfill (例如 A=b)
4. 在 groupby(A) 内部,如果 value 是 nan 但没有数据点可跟随,ffill (A=以 c 为例)
我闻到三元 + lambda 的味道,但想要一种 Python 的写法。
基本上,起点是:
df
A B
0 a NaN
1 a NaN
2 a 3.0
3 a 4.0
4 b 4.0
5 b NaN
6 b 6.0
7 b 6.0
8 c 7.0
9 c NaN
10 c NaN
df 应该变成:
df
A B
0 a 0.0
1 a 0.0
2 a 3.0
3 a 4.0
4 b 4.0
5 b 6.0
6 b 6.0
7 b 6.0
8 c 7.0
9 c 7.0
10 c 7.0
解决方案
我们可以这样做GroupBy.ffill
,然后我们确定每个组的中间结果都正确填写,然后我们可以使用Series.fillna
with 0
,因为这些是唯一剩下的值:
df['B'] = df.groupby('A')['B'].ffill().fillna(0)
A B
0 a 0.0
1 a 0.0
2 a 3.0
3 a 4.0
4 b 4.0
5 b 4.0
6 b 6.0
7 b 6.0
8 c 7.0
9 c 7.0
10 c 7.0