Диагональ суммы панд с групповым

1

Я хотел бы суммировать диагональные значения каждого года и остатка, группируя по объектам. Например, для объекта a будет 1 + 10 + 11 + 12 + 13. Есть ли способ сделать это без разделения таблицы по объекту? Обратите внимание, что количество строк может отличаться для каждого объекта. Я пытался: df.groupby('Company'). Apply (лямбда-x: x.reset_index(). Loc [0, 'Year_0'] +x.reset_index(). Loc [1, 'Year_1'] + x.reset_index(). loc [2, 'Year_2'] +x.reset_index(). loc [3, 'Year_3']), но для него требуется определенное количество строк. Спасибо!


Year_0  Year_1  Year_2  Year_3  Residue Company
1       0.0     0.0     0.0      10      a
1       10      0.0     0.0      10      a
1       10       11     0.0      10      a
1       10       11      12      13      a
2       0      0.0      0.0      12      b
2       11     0.0      0.0      12      b
2       11      12      0.0      12      b
2       11      12       13      12      b
-3     0       0.0      0.0      -1      c
-3     -1       0.0     0.0      -1      c
-3     -2       -3      0.0      -1      c
  • 0
    попробуйте groupby компании следом с trace
  • 0
    Какой ожидаемый результат?
Теги:
pandas
pandas-groupby

4 ответа

0

Следуя другим ответам по использованию diagonal numpy. Вы можете использовать filter панд, чтобы просто отфильтровать Year_* каждой подгруппы.

groups = df.groupby('Company')

new_df = groups.apply(lambda x: x.filter(regex='Year_*').values.diagonal().sum())

print(new_df)

Это дает следующий вывод:

Company
a    34.0
b    38.0
c    -7.0
dtype: float64
0

используя numpy и pandas groupby

df.groupby('Company').apply(lambda x: np.sum(np.ma.diag(x.values)) + x.values[-1][-2])

Выход

Company
a    47.0
b    50.0
c    -8.0
dtype: float64
0

Или используйте groupby:

print(df.groupby('Company',as_index=False).tail(1)
          .set_index('Company')
          .sum(axis=1)
          .reset_index(name='new'))

Выход:

  Company   new
0       a  47.0
1       b  50.0
2       c  -9.0
0

Я считаю, что вам нужно drop_duplicates, создать индекс по set_index, sum строк и последний reset_index для преобразования Series в DataFrame:

df1 = (df.drop_duplicates('Company', keep='last')
         .set_index('Company')
         .sum(axis=1)
         .reset_index(name='new'))
print (df1)
  Company   new
0       a  47.0
1       b  50.0
2       c  -9.0

Или используйте GroupBy.last:

df1 = (df.groupby('Company', as_index=False).last()
       .set_index('Company')
       .sum(axis=1)
       .reset_index(name='new'))

Если вы хотите работать с диагональными значениями, используйте numpy.diagonal:

s = df.drop_duplicates('Company', keep='last').set_index('Company')['Residue']

df = (df.drop('Residue', axis=1)
      .set_index('Company')
      .groupby('Company')
      .apply(lambda x: x.values.diagonal().sum())
      .add(s)
      .reset_index(name='new'))
print (df)
  Company   new
0       a  47.0
1       b  50.0
2       c  -8.0

Последнее значение - -8, потому что -3 + -1 + -3 + -1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню