Никогда не используйте слово «шаблон», поскольку оно очень неоднозначно. Всегда используйте «string» или «regexp» (или в шаблоне «globbing» оболочки), в зависимости от того, что вы действительно имеете в виду.
Конкретный ответ, который вы хотите:
awk 'f{print;f=0} /regexp/{f=1}' file
или специализируется на более общем решении N-й записи после regexp (ниже идиомы «c»):
awk 'c&&!--c; /regexp/{c=1}' file
Следующие идиомы описывают, как выбрать диапазон записей, заданных для определенного регулярного выражения:
a) Распечатайте все записи из некоторого regexp:
awk '/regexp/{f=1}f' file
b) Распечатайте все записи после некоторого регулярного выражения:
awk 'f;/regexp/{f=1}' file
c) Распечатайте N-ю запись после некоторого regexp:
awk 'c&&!--c;/regexp/{c=N}' file
d) Распечатайте каждую запись, кроме N-й записи, после некоторого регулярного выражения:
awk 'c&&!--c{next}/regexp/{c=N}1' file
e) Распечатайте N записей после некоторого регулярного выражения:
awk 'c&&c--;/regexp/{c=N}' file
f) Распечатайте каждую запись, кроме N записей, после некоторого регулярного выражения:
awk 'c&&c--{next}/regexp/{c=N}1' file
g) Распечатайте N записей из некоторого регулярного выражения:
awk '/regexp/{c=N}c&&c--' file
Я изменил имя переменной с «f» на «found» на «c» для «count», если это необходимо, так как это более выразительно, что переменная на самом деле IS.
In [20]: df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)})
In [21]: df
Out[21]:
A B values
0 1 1 10
1 1 2 15
2 2 1 20
3 2 2 25
In [22]: df['sum_values_A'] = df.groupby('A')['values'].transform(np.sum)
In [23]: df
Out[23]:
A B values sum_values_A
0 1 1 10 25
1 1 2 15 25
2 2 1 20 45
3 2 2 25 45
Я нашел способ, используя join
:
In [101]:
aggregated = df.groupby('A').sum()['values']
aggregated.name = 'sum_values_A'
df.join(aggregated,on='A')
Out[101]:
A B values sum_values_A
0 1 1 10 25
1 1 2 15 25
2 2 1 20 45
3 2 2 25 45
У кого-то есть более простой способ сделать это?
In [15]: def sum_col(df, col, new_col):
....: df[new_col] = df[col].sum()
....: return df
In [16]: df.groupby("A").apply(sum_col, 'values', 'sum_values_A')
Out[16]:
A B values sum_values_A
0 1 1 10 25
1 1 2 15 25
2 2 1 20 45
3 2 2 25 45
Это не так прямо, но я нашел его очень интуитивным (использование карты для создания новых столбцов из другого столбца) и может быть применено ко многим другим случаям:
gb = df.groupby('A').sum()['values']
def getvalue(x):
return gb[x]
df['sum'] = df['A'].map(getvalue)
df