Сброс индекса по столбцу «Дата» [дубликат]

Для обратного требования только , позволяющего определенным символам в строке, вы можете использовать регулярные выражения с помощью оператора набора дополнений [^ABCabc]. Например, чтобы удалить все, кроме букв ascii, цифр и дефиса:

>>> import string
>>> import re
>>>
>>> phrase = '  There were "nine" (9) chick-peas in my pocket!!!      '
>>> allow = string.letters + string.digits + '-'
>>> re.sub('[^%s]' % allow, '', phrase)

'Therewerenine9chick-peasinmypocket'

Из документация по регулярному выражению python :

Символы, которые не входят в диапазон, можно сопоставить, дополняя набор. Если первый символ набора '^', все символы, которые не находятся в наборе, будут сопоставлены. Например, [^5] будет соответствовать любому символу, кроме «5», а [^^] будет соответствовать любому символу, кроме '^'. ^ не имеет особого значения, если это не первый символ в наборе.

27
задан 21 December 2012 в 22:27
поделиться

3 ответа

In [16]: df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)
Out[16]: 
0    0.0
1    0.5
2    1.5
3    3.0
4    3.5
5    4.5

In [17]: df.groupby('id')['x'].cumsum()
Out[17]: 
0     0
1     1
2     3
3     3
4     7
5    12
29
ответ дан Garrett 25 August 2018 в 18:24
поделиться

Для гуглеров, которые приходят на этот старый вопрос:

Относительно комментария @ kekert к ответу @ Гаррета, чтобы использовать новый

df.groupby('id')['x'].rolling(2).mean()

, а не устаревший

df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)

Любопытно, что новый подход .rolling (). mean () возвращает многоиндексный ряд, сначала индексированный столбцом group_by, а затем индекс. В то время как старый подход просто возвращал серию, индексированную исключительно исходным индексом df, что, возможно, имеет меньшее значение, но очень удобно для добавления этой серии в новый столбец в исходный фрейм.

So Я думаю, что я нашел решение, которое использует новый метод roll (), и все еще работает одинаково:

df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)

, который должен дать вам серию

0    0.0
1    0.5
2    1.5
3    3.0
4    3.5
5    4.5

, которая вы можете добавить в качестве столбца:

df['x'] = df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)
38
ответ дан Kevin Wang 25 August 2018 в 18:24
поделиться

Я не уверен в механике, но это работает. Обратите внимание, что возвращаемое значение - это просто ndarray. Я думаю, что вы можете применить любую кумулятивную или «скользящую» функцию таким образом, и она должна иметь тот же результат.

Я протестировал ее с помощью cumprod, cummax и cummin, и все они вернулись ndarray. Я думаю, что панды достаточно умны, чтобы знать, что эти функции возвращают серию, и поэтому функция применяется как преобразование, а не агрегация.

In [35]: df.groupby('id')['x'].cumsum()
Out[35]:
0     0
1     1
2     3
3     3
4     7
5    12

Редактирование: мне было любопытно, что этот синтаксис возвращает Серия:

In [54]: df.groupby('id')['x'].transform('cumsum')
Out[54]:
0     0
1     1
2     3
3     3
4     7
5    12
Name: x
1
ответ дан Zelazny7 25 August 2018 в 18:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: