Я хотел бы суммировать диагональные значения каждого года и остатка, группируя по объектам. Например, для объекта 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
Следуя другим ответам по использованию 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
используя 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
Или используйте 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
Я считаю, что вам нужно 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
.
groupby
компании следом сtrace