python - Pandas :填充组内的缺失值

标签 python pandas

我有一些来自实验的数据,在每个试验中都有一些单个值,被 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/

相关文章:

Python 时区偏移错误?

python - 使用 GridsearchCV 调整参数未给出最佳结果

python - 使用 Pandas 对包含数字和文本的列求和

python - 将超过 100% 的百分比视为两位数 %

python - 我可以指定 pandas 的容器从我的数据框中切割为列吗?

PYTHON:能够从同一个类中调用方法需要什么?

python - 如何重新组合数据框并累积列的值?

python - Pandas 在枢轴后调整数据框大小?

python 和 sll/Exchange 2007 : No suitable authentication method found

python - 如何使用 pandas 数据框的特定行和列创建新系列?