#python-3.x #pandas #dataframe
#python-3.x #pandas #фрейм данных
Вопрос:
Я пытаюсь установить диапазоны значений NaN в df следующим образом:
[Column_1] [Column_2]
1 A 10
2 B 20
3 C NaN
4 D NaN
5 E NaN
6 F 60
7 G 65
8 H NaN
9 I NaN
10 J NaN
11 K 90
12 L NaN
13 M 100
Итак, на данный момент я только что перечислил индекс значений NaN в этой строке:
df['Column_2'].isnull()].index.tolist()
Но тогда я не знаю, как установить интервалы этих значений в терминах Column_1 , которые в данном случае будут:
[C-E] [H-J] [L]
Спасибо за ваши идеи!
Ответ №1:
Отфильтруйте строки, в которых находятся значения Column_2
NaN
, затем groupby
эти строки при последовательном появлении NaN
значений в Column_2
и соберите соответствующие значения Column_1
внутри понимания списка:
m = df['Column_2'].isna()
r = [[*g['Column_1']] for _, g in df[m].groupby((~m).cumsum())]
print(r)
[['C', 'D', 'E'], ['H', 'I', 'J'], ['L']]
Комментарии:
1. Спасибо! @Shubham_Sharma, я просто добавил несколько строк, чтобы получить ответ, который я хотел. Могу я попросить вас дать краткое объяснение структуры вашего кода? Я не знаком с некоторым синтаксисом, который вы сделали.
2. В частности: *g, для _, ~m, .cumsum()
3.
(~m).cumsum
используется для создания группера, который можно использовать для группировки фрейма данных по дискретным последовательным вхождениямNaN
значений в столбце 2.[*g[column1]]
используется для распаковки значенийcolumn1
в сгруппированном фреймеg
, по сути, это эквивалентно использованиюg[column1].tolist()