2016-03-04 2 views
1

Предположим, что я пытаюсь отобразить total_cases_age на cases_by_age где dataframes являются:значения Карта на DataFrame двумя колоннами

results_grouped_age = results_grouped[['Make', 'age', 'Test Result', 'Number of Cases']].copy() 
    cases_by_age = results_grouped_age[['Make','age','Test Result','Number of Cases']].groupby(['Make','age','Test Result']).sum().reset_index() 
    total_cases_age = cases_by_age.groupby(['Make','age'])['Number of Cases'].sum() 

Однако в то время как я обычно делаю:

cases_by_age['Total Cases'] = cases_by_age['age'].map(total_cases_age) 

Индексы total_cases_age на самом деле сочетание «make and age», и это на самом деле то, что я хочу сделать. Чтобы легче понять мою проблему, предположим, что у меня есть таблица cases_by_age»

 Make  age  Test Result  Number of Cases 
0 ALFA ROMEO 0-3   ABA    1 
1 ALFA ROMEO 0-3   ABR    NaN 
2 ALFA ROMEO 0-3   F    45 
3 ALFA ROMEO 0-3   P    268 
4 ALFA ROMEO 0-3   PRS    21 
5 ALFA ROMEO 3-5   ABA    NaN 
6 ALFA ROMEO 3-5   ABR    NaN 
7 ALFA ROMEO 3-5   F    159 
8 ALFA ROMEO 3-5   P    720 

И конечный результат должен быть что-то вроде этого:

 Make  age  Test Result  Number of Cases  Total Cases by Age 
0 ALFA ROMEO 0-3   ABA    1     335 
1 ALFA ROMEO 0-3   ABR    NaN     335 
2 ALFA ROMEO 0-3   F    45     335 
3 ALFA ROMEO 0-3   P    268     335 
4 ALFA ROMEO 0-3   PRS    21     335 
5 ALFA ROMEO 3-5   ABA    NaN     879 
6 ALFA ROMEO 3-5   ABR    NaN     879 
7 ALFA ROMEO 3-5   F    159     879 
8 ALFA ROMEO 3-5   P    720     879 

И так далее для марок и возрастов

Любая помощь будет будем оценивать

ответ

1

Вы можете сделать groupby - sum, а затем левый-merge:

pd.merge(
    df, 
    df['Number of Cases'].groupby(df['age']).sum().reset_index().rename(
     columns={'Number of Cases': 'Total Cases by Age'}), 
    how='left') 

Пример

Предположим, вы начинаете с

df = pd.DataFrame({ 
    'Make': ['ALPHA ROMEO'] * 3, 
    'age': ['0-3', '0-3', '3-5'], 
    'Number of Cases': [1, 10, 2] 
    }) 
>>> df 
    Make Number of Cases age 
0 ALPHA ROMEO 1 0-3 
1 ALPHA ROMEO 10 0-3 
2 ALPHA ROMEO 2 3-5 

Тогда groupby - sum дает:

>>> df['Number of Cases'].groupby(df['age']).sum().reset_index().rename(
    columns={'Number of Cases': 'Total Cases by Age'}) 
    age Total Cases by Age 
0 0-3 11 
1 3-5 2 

И сочетание дает:

>>> pd.merge(
    df, 
    df['Number of Cases'].groupby(df['age']).sum().reset_index().rename(
     columns={'Number of Cases': 'Total Cases by Age'}), 
    how='left') 
    Make Number of Cases age Total Cases by Age 
0 ALPHA ROMEO 1 0-3 11 
1 ALPHA ROMEO 10 0-3 11 
2 ALPHA ROMEO 2 3-5 2 
+0

Спасибо за ваш ответ, однако идея здесь просуммировать по маркам и возрасту транспортного средства, так сказать, в вашем примере GroupBy суммы придется найти сумму всех автомобилей с особенно возраст и сделать это и сопоставить это значение рядом со всеми строками с этой маркой и возрастом (независимо от результата теста) –

+0

На самом деле, неважно, я пробовал группировать оба, и все получается хорошо. Благодаря! –

Смежные вопросы