Эффективный способ сопоставления двух столбцов с одним и тем же типом данных

#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. Спасибо, это как раз то, что я искал!