#python #pandas #dataframe #multi-index
#питон #панды #фрейм данных #многоиндексный
Вопрос:
У меня есть следующий фрейм данных:
import pandas as pd df = pd.DataFrame( ( { "foo": ["1", "1", "1", "1", "2", "2", "2", "2"], "bar": ["1", "2", "3", "4", "1", "2", "3", "4"], "info": [1, 2, 3, 4, 5, 6, 7, 8], "event": [0, 0, 1, 0, 0, 1, 0, 0], } ) ) # set multiindex df.set_index(["foo", "bar"], inplace=True) print(df) info event foo bar 1 1 1 0 2 2 0 3 3 1 4 4 0 2 1 5 0 2 6 1 3 7 0 4 8 0
Я хотел бы разрезать фрейм данных только для сохранения строк после события == 1:
фу | бар | ценности | событие |
---|---|---|---|
1 | 3 | 3 | 1 |
1 | 4 | 4 | 0 |
2 | 2 | 6 | 1 |
2 | 3 | 7 | 0 |
2 | 4 | 8 | 0 |
Частота дискретизации достаточно высока, чтобы я мог отбросить строки 1, но предпочел бы сохранить их, если это возможно.
Комментарии:
1. Какой результат вы пытаетесь получить?
2. Стол, который там стоит. Он сбрасывает первые 2 в foo:1 и первые 1 в foo:2
Ответ №1:
Вы могли бы попробовать вот так:
# Get relevant indices index_of_first_event = df.loc[("1", "1"):, "event"].eq(1).idxmax() last_index_of_first_sub_dataframe = ("1", str(df.loc[("1", ), :].shape[0])) index_of_second_event = df.loc[("2", "1"):, "event"].eq(1).idxmax() # Get new dataframe new_df = pd.concat( [ df.loc[index_of_first_event:last_index_of_first_sub_dataframe, :], df.loc[index_of_second_event:, :], ] ) print(new_df) # Output info event foo bar 1 3 3 1 4 4 0 2 2 6 1 3 7 0 4 8 0
Ответ №2:
То, что я в итоге сделал, было:
1.Mapped 0-gt;na 2.Back-filled the event column 3.Dropped all 1's