我有一些来自实验的数据,在每个试验中都有一些单个值,被 NA
包围,我想在整个试验中填写这些值:
df = pd.DataFrame({'trial': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3],
'cs_name': [np.nan, 'A1', np.nan, np.nan, np.nan, np.nan, 'B2',
np.nan, 'A1', np.nan, np.nan, np.nan]})
Out[177]:
cs_name trial
0 NaN 1
1 A1 1
2 NaN 1
3 NaN 1
4 NaN 2
5 NaN 2
6 B2 2
7 NaN 2
8 A1 3
9 NaN 3
10 NaN 3
11 NaN 3
我可以通过使用 bfill()
和 ffill()
在整个试验中填充这些值,但我想知道是否有更好的方法实现这一目标的方法。
df['cs_name'] = df.groupby('trial')['cs_name'].ffill()
df['cs_name'] = df.groupby('trial')['cs_name'].bfill()
预期输出:
cs_name trial
0 A1 1
1 A1 1
2 A1 1
3 A1 1
4 B2 2
5 B2 2
6 B2 2
7 B2 2
8 A1 3
9 A1 3
10 A1 3
11 A1 3
最佳答案
另一种方法是使用 first_valid_index
和一个 transform
:
In [11]: g = df.groupby('trial')
In [12]: g['cs_name'].transform(lambda s: s.loc[s.first_valid_index()])
Out[12]:
0 A1
1 A1
2 A1
3 A1
4 B2
5 B2
6 B2
7 B2
8 A1
9 A1
10 A1
11 A1
Name: cs_name, dtype: object
这应该比使用 ffill 后接 bfill 更有效...
并使用它来更改 cs_name
列:
df['cs_name'] = g['cs_name'].transform(lambda s: s.loc[s.first_valid_index()])
注意:我认为如果有一种方法可以抓取 pandas 中的第一个非空对象,在 numpy 中它是 an open request,那将是一个很好的改进。 ,我认为目前没有一种方法(我可能是错的!)...
关于python - Pandas :填充组内的缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265930/