python 条件分组填充
python conditional grouped ffill
In [179]: test = pd.DataFrame({'A': [1,1,1,2,2,2,2,3,3,4,4], 'B': [-999, np.nan, np.nan, 3
...: , np.nan, -999, np.nan, 5,-999,np.nan, 3]})
In [180]: test
Out[180]:
A B
0 1 -999.0
1 1 NaN
2 1 NaN
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 NaN
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
如果先例值是按 A 列分组的 -999,我想在 B 列中填充 nan 值
期望的结果:
Out[181]:
A B
0 1 -999.0
1 1 -999.0
2 1 -999.0
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 -999.0
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
我使用 iterrows 检查每一行,但是......我的真实 df 有 1M 行
谢谢
fillvals = df.groupby('A').ffill()
df['B'].fillna(fillvals[fillvals.eq(-999)]['B'], inplace=True)
结果:
A B
0 1 -999.0
1 1 -999.0
2 1 -999.0
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 -999.0
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
df.groupby('A').ffill()
将用以前的值填充任何 NaN
值,保留该帧的副本。
fillvals[fillvals.eq(-999)]['B'] to filter the indices that are only
-999`,即前面的值。
使用fillna
从过滤后的帧中填充这些-999
。
test['B'] = (
test['B'].fillna(test.groupby('A').B.ffill().where(lambda x: x.eq(-999)))
)
A B
0 1 -999.0
1 1 -999.0
2 1 -999.0
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 -999.0
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
In [179]: test = pd.DataFrame({'A': [1,1,1,2,2,2,2,3,3,4,4], 'B': [-999, np.nan, np.nan, 3
...: , np.nan, -999, np.nan, 5,-999,np.nan, 3]})
In [180]: test
Out[180]:
A B
0 1 -999.0
1 1 NaN
2 1 NaN
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 NaN
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
如果先例值是按 A 列分组的 -999,我想在 B 列中填充 nan 值
期望的结果:
Out[181]:
A B
0 1 -999.0
1 1 -999.0
2 1 -999.0
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 -999.0
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
我使用 iterrows 检查每一行,但是......我的真实 df 有 1M 行
谢谢
fillvals = df.groupby('A').ffill()
df['B'].fillna(fillvals[fillvals.eq(-999)]['B'], inplace=True)
结果:
A B
0 1 -999.0
1 1 -999.0
2 1 -999.0
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 -999.0
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0
df.groupby('A').ffill()
将用以前的值填充任何 NaN
值,保留该帧的副本。
fillvals[fillvals.eq(-999)]['B'] to filter the indices that are only
-999`,即前面的值。
使用fillna
从过滤后的帧中填充这些-999
。
test['B'] = (
test['B'].fillna(test.groupby('A').B.ffill().where(lambda x: x.eq(-999)))
)
A B
0 1 -999.0
1 1 -999.0
2 1 -999.0
3 2 3.0
4 2 NaN
5 2 -999.0
6 2 -999.0
7 3 5.0
8 3 -999.0
9 4 NaN
10 4 3.0