Я думаю, что в целом было бы лучше сгруппировать и заполнить. Мы используем DataFrame.groupby
:
df.groupby('two').apply(lambda x: x.ffill().bfill())
Это можно сделать без использования группового режима, но вам нужно отсортировать по обоим столбцам:
df.sort_values(['two','one']).ffill().sort_index()
Ниже я покажу вам, как метод, предложенный в другом ответе, может потерпеть неудачу:
Вот пример:
df=pd.DataFrame({'one':['a',np.nan,'c','d',np.nan,'c','b','b',np.nan,'a'],'two':[10,20,30,40,10,30,20,20,30,10]})
print(df)
one two
0 a 10
1 NaN 20
2 c 30
3 d 40
4 NaN 10
5 c 30
6 b 20
7 b 20
8 NaN 30
9 a 10
df.sort_values(['two']).fillna(method='ffill').sort_index()
one two
0 a 10
1 a 20
2 c 30
3 d 40
4 a 10
5 c 30
6 b 20
7 b 20
8 c 30
9 a 10
Как видно из предложенного метода, в другом из ответов здесь нет ответа ( см. Строку 1 ). Это происходит потому, что некоторое значение NaN может быть первым для определенного значения столбца 'two' и заполнено значением верхней группы.
Этого не произойдет, если мы сгруппируем сначала:
df.groupby('two').apply(lambda x: x.ffill().bfill())
one two
0 a 10
1 b 20
2 c 30
3 d 40
4 a 10
5 c 30
6 b 20
7 b 20
8 c 30
9 a 10
Как я уже сказал, мы можем использовать DataFrame.sort_values
, но нам нужно отсортировать оба столбца. Я рекомендую вам этот метод .
df.sort_values(['two','one']).ffill().sort_index()
one two
0 a 10
1 b 20
2 c 30
3 d 40
4 a 10
5 c 30
6 b 20
7 b 20
8 c 30
9 a 10