Для обратного требования только , позволяющего определенным символам в строке, вы можете использовать регулярные выражения с помощью оператора набора дополнений [^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», а[^^]
будет соответствовать любому символу, кроме'^'
.^
не имеет особого значения, если это не первый символ в наборе.
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
Для гуглеров, которые приходят на этот старый вопрос:
Относительно комментария @ 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)
Я не уверен в механике, но это работает. Обратите внимание, что возвращаемое значение - это просто 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