#python #pandas #dataframe
Вопрос:
У меня есть фрейм данных с двумя столбцами: TrialType и диаметр. Мне нужно найти везде, где TrialType = = «начало», а затем получить диаметр для всех 2500 строк до и после этих местоположений включительно. Я попробовал следующее:
idx = df.loc(df[df['trialType']=='start']) df.iloc[idx - 2500 : idx 2500]
Моя цель состоит в том, чтобы иметь фрейм данных только с теми соответствующими строками (2500 строк между каждой «начальной» пробной версией). Ниже приведен пример, только с гораздо меньшим количеством строк:
trialType diameter start 3.15 3.17 3.18 start 3.14 3.13 3.13
Ответ №1:
Интересный.
Что о:
idx = df.loc[lambda x: x['trialType']=='start'].index rows = df.loc[idx] a = df.shift( 2500).loc[idx] b = df.shift(-2500).loc[idx]
Затем вы можете комбинировать их так, как считаете нужным.
pd.concat([a,rows,b])
Вы также могли бы сделать:
idx = df.loc[lambda x: x['trialType']=='start'].index df.loc[lambda x: (x.index-2500).isin(idx) ¦ x.index.isin(idx) ¦ (x.index 2500).isin(idx)]
Но вам придется изменить приведенный выше код,если ваш индекс не является последовательным (0,1,2,3 и т.д.).
Комментарии:
1. Извини, мне следовало быть более конкретным. Я пытаюсь получить все строки от «начала» до 2500 до и после включительно. Есть ли способ изменить ваш код для достижения этой цели?
2. Привет @KateP — у вас есть только одно начальное значение или несколько? Если у вас есть только один, то ваш исходный код должен работать. Не могли бы вы отредактировать свой вопрос с иллюстративным примером того, что вы ищете?
3. Конечно, только что отредактировано. Существует несколько начальных значений. Я заметил, что код отлично работает для одного значения — просто не знаю, как захватить их все.
Ответ №2:
Я изменю только первую строку на
idx = df.index[df['trialType']=="start"].tolist()[0]
это вернет первый индекс, в котором условие истинно
строка 2 должна работать нормально df.iloc[idx - 2500 : idx 2500]
вы можете запустить этот код, чтобы попробовать
df = pd.DataFrame({'team': ['A', 'A', 'A', 'B', 'Z', 'C', 'C', 'D'], 'points': [5, 7, 7, 9, 12, 9, 9, 4], 'rebounds': [11, 8, 10, 6, 6, 5, 9, 12]}) df
idx = df.index[df['team']=="B"].tolist()[0] df.iloc[idx - 2 : idx 2]
выход
team points rebounds 1 A 7 8 2 A 7 10 3 B 9 6 4 Z 12 6