Как я могу получить до или после n строк после определенного значения столбца в Pandas Dataframe - PullRequest
0 голосов
/ 09 января 2019

У меня есть результирующий набор, из которого я хочу получить следующие n строк (или предыдущие n строк) после (до) строки, соответствующей определенному значению ячейки.

Так, например, вот мои данные:

A    B   C
1   10   2018-11-01
2   20   2018-10-31
3   30   2018-10-30
4   40   2018-10-29
5   50   2018-10-28
6   60   2018-10-27

Мне интересно получить 3 строки перед строкой, где C = 2018-10-28 (тип даты), включая строку C = 2018-10-28, поэтому мой вывод должен быть

 A    B   C
3   30   2018-10-30
4   40   2018-10-29
5   50   2018-10-28

Я пробовал loc, но ему нужен индекс, поэтому возникает ошибка: df2 = df2.loc[:C].tail(3) как TypeError: can't compare datetime.date to int.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Проверьте dtypes в df: если df.dtypes из C столбцов не является datetime, преобразуйте его в datetime:

df.dtypes
Out[46]:
B     int64
C    object
dtype: object

df['C'] = pd.to_datetime(df['C'])
df.dtypes
Out[48]:
B             int64
C    datetime64[ns]
dtype: object

Теперь столбцы 'C' сопоставимы со строками в формате datetime:

target_date = "2018-10-28"
df[df['C'] >= target_date].tail(3)
    B          C
A
3  30 2018-10-30
4  40 2018-10-29
5  50 2018-10-28

Но в более общем случае (существует более одного целевого столбца и данные не упорядочены), вы можете использовать следующий подход:

df
A    B          C

0   10 2018-09-10
1   20 2018-07-11
2   20 2018-06-12
3   30 2018-07-13
4   50 2018-10-28
5   10 2018-11-01
6   20 2018-10-31
7   30 2018-10-30
8   40 2018-10-29
9   50 2018-10-28
10  60 2018-10-27

index = df[df['C'] == '2018-10-28'].index
index
Out:
Int64Index([4, 9], dtype='int64', name=0)

Используйте slice и .iloc для извлечения целей:

slices = [slice(i, i-3, -1) for i in indicies]
slices
Out: [slice(4, 1, -1), slice(9, 6, -1)]

pd.concat([df.iloc[sl] for sl in slices])
    B          C
A
4  50 2018-10-28
3  30 2018-07-13
2  20 2018-06-12
9  50 2018-10-28
8  40 2018-10-29
7  30 2018-10-30

Результирующий кадр не отсортирован, но его будет легко исправить. Этот подход работает только для числового индекса, но в его отсутствие вы можете просто добавить его с помощью pd.reset_index().

0 голосов
/ 09 января 2019

Мне интересно получить 3 строки перед строкой, где C = 2018-10-28

Сначала найдите индекс с помощью pd.Series.idxmax, затем нарежьте с помощью pd.DataFrame.iloc, который поддерживает целочисленное позиционное индексирование:

idx = df['C'].eq('2018-10-28').idxmax()
res = df.iloc[idx-2: idx+1]

print(res)

#    A   B          C
# 2  3  30 2018-10-30
# 3  4  40 2018-10-29
# 4  5  50 2018-10-28
0 голосов
/ 09 января 2019

вы можете использовать что-то

s = StringIO("""
A    B   C
1   10   2018-11-01
2   20   2018-10-31
3   30   2018-10-30
4   40   2018-10-29
5   50   2018-10-28
6   60   2018-10-27""")

final = pd.read_csv(s, sep='\s\s+', engine='python')
final['C] = pd.to_datetime(final['C])

окончательный

  A   B           C
0  1  10  2018-11-01
1  2  20  2018-10-31
2  3  30  2018-10-30
3  4  40  2018-10-29
4  5  50  2018-10-28
5  6  60  2018-10-27

final.loc[final[final['C'] == '2018-10-28'].index[0]-2:final[final['C'] == '2018-10-28' ].index[0]]

выход

   A   B           C
2  3  30  2018-10-30
3  4  40  2018-10-29
4  5  50  2018-10-28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...