Proj_Com_Sum   comp_1   comp_2    comp_3   Proj_Val_sum  val_1  val_2  val_3 
70              10         20      35       67            20      30    15
100             50         30      25       70            25      30    15

Учитывая вышеизложенное как Pandas DataFrame df, я хотел бы добавить Colunm Com_total, Val_total, Proj_Tot_Diff

где

Com_total = comp_1 + comp_2 + comp_3
Val_total = val_1 + val_2 + val_3
Proj_Tot_Diff = Com_total - Proj_Com_Sum

Так как у меня есть про комп .. это будет длинный код, чтобы написать

Com_total = comp_1 + comp_2 + comp_3 .. comp_58

Обратите внимание . comp_1..comp_2 может не соответствовать шаблону регулярных выражений. это могут быть названия штатов, например, Флорида, Нью-Йорк и т. д. Все, что мы знаем, это от 2-го столбца до 58-го столбца.

Следовательно, я хочу некоторый код как

 df['Com_total']= df[ col 2:58 ].sum
 # Whats the correct Syntax

Как указать промежуточные столбцы в точной записи. Пожалуйста, помогите с правильным синтаксисом

3
user2458922 3 Июл 2019 в 00:38

3 ответа

Лучший ответ

Изменить : как при редактировании. чтобы получить сумму из последовательных столбцов 2 - 58, вы просто используете .iloc с 1:58 для столбцов, потому что целое число loc начинается с 0, а iloc игнорирует номер правого края.

df['Com_total'] = df.iloc[:,1:58].sum(1)

< Сильный > Оригинал :
Это безумное и забавное решение, использующее extract для имен столбцов и groupby, sum. Наконец, join вернемся к df.

df.join(df.groupby(df.columns.str.extract('(comp_|val_)'), axis=1).sum(axis=1) \
          .add_suffix('total').assign(Proj_Tot_Diff= lambda x: x.comp_total - df.Proj_Com_Sum))


Out[1958]:
   Proj_Com_Sum  comp_1  comp_2  comp_3  Proj_Val_sum  val_1  val_2  val_3  \
0            70      10      20      35            67     20     30     15
1           100      50      30      25            70     25     30     15

   comp_total  val_total  Proj_Tot_Diff
0          65         65             -5
1         105         70              5
1
Andy L. 2 Июл 2019 в 23:33

Вы можете использовать нарезку, если ваши заголовки столбцов упорядочены должным образом, однако безопаснее, если вы используете метод @ piRSquared, используя filter:

df['Com_total'] = df.loc[:,'comp_1':'comp_3'].sum(1)
df['Val_total'] = df.loc[:,'val_1':'val_3'].sum(1)
df['Proj_Tot_diff'] = df['Com_total'] - df['Proj_Com_Sum']
print(df)

Выход:

   Proj_Com_Sum  comp_1  comp_2  comp_3  Proj_Val_sum  val_1  val_2  val_3  \
0            70      10      20      35            67     20     30     15   
1           100      50      30      25            70     25     30     15   

   Com_total  Val_total  Proj_Tot_diff  
0         65         65             -5  
1        105         70              5  
5
Scott Boston 3 Июл 2019 в 03:09

filter и assign

df.assign(
    Com_total=df.filter(regex='comp_\d+').sum(1),
    Val_total=df.filter(regex='val_\d+').sum(1),
    Proj_Tot_Diff=lambda d: d.Com_total - d.Proj_Com_Sum
)

  Proj_Com_Sum  comp_1  comp_2  comp_3  Proj_Val_sum  val_1  val_2  val_3  \
0            70      10      20      35            67     20     30     15   
1           100      50      30      25            70     25     30     15   

   Com_total  Val_total  Proj_Tot_Diff  
0         65         65             -5  
1        105         70              5  
3
piRSquared 2 Июл 2019 в 21:51