#python #pandas #dataframe
Вопрос:
В этой проблеме » A » и » B » хранят одни и те же данные (номера страниц). «Hits_A» — это сумма попаданий в соответствии с » A » (предыдущая группировка, не показана). Я хотел бы суммировать «Hits_A» на основе столбца «B», а затем связать значения с номерами страниц в столбце «A», например так:
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7], 'B': [3, 4, 5, 2, 1, 1, 6],
'Hits_A': [10, 40, 50, 35, 24, 60, 30]})
tmp = df.drop('A', axis=1)
tmp = tmp.groupby('B').sum().reset_index()
tmp = tmp.rename(columns={'B':'A', 'Hits_A':'Hits_B'})
output = pd.merge(df, tmp, how='left', on='A').drop('B', axis=1)
print(df)
доходность
A B Hits_A
0 1 3 10
1 2 4 40
2 3 5 50
3 4 2 35
4 5 1 24
5 6 1 60
6 7 6 30
print(output)
доходность
A Hits_A Hits_B
0 1 10 84.0
1 2 40 35.0
2 3 50 10.0
3 4 35 40.0
4 5 24 50.0
5 6 60 30.0
6 7 30 NaN
Это результаты, которые я хочу воспроизвести менее нервным, более чистым способом. Я не очень привык к таким вещам, как лямбда-функции, и мне было интересно, можно ли всего этого достичь за меньшее количество строк?
Ответ №1:
Мы можем groupby
, а sum
затем map
сгруппировать сумму в столбец A
df['Hits_B'] = df['A'].map(df.groupby('B')['Hits_A'].sum())
A B Hits_A Hits_B
0 1 3 10 84.0
1 2 4 40 35.0
2 3 5 50 10.0
3 4 2 35 40.0
4 5 1 24 50.0
5 6 1 60 30.0
6 7 6 30 NaN
Комментарии:
1. Спасибо, это как раз то, что я искал!