Подмножество и цикл для создания нового столбца [дубликат]

Никогда не используйте слово «шаблон», поскольку оно очень неоднозначно. Всегда используйте «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.

19
задан foglerit 6 November 2012 в 20:17
поделиться

4 ответа

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
24
ответ дан Wouter Overmeire 21 August 2018 в 22:54
поделиться
  • 1
    Большой! Я знал, что должен быть один лайнер. Благодарю. – foglerit 7 November 2012 в 00:03

Я нашел способ, используя 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

У кого-то есть более простой способ сделать это?

3
ответ дан foglerit 21 August 2018 в 22:54
поделиться
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
3
ответ дан Garrett 21 August 2018 в 22:54
поделиться

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

gb = df.groupby('A').sum()['values']

def getvalue(x):
    return gb[x]

df['sum'] = df['A'].map(getvalue)
df
3
ответ дан joaquin 21 August 2018 в 22:54
поделиться
  • 1
    Спасибо, метод карты кажется довольно мощным. Конечно, он будет часто использовать его. – foglerit 7 November 2012 в 00:04
Другие вопросы по тегам:

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