в Pandas (Python), как добавить столбец с groupby, на который ссылаются два столбца

, потому что я не знаю настройки языкового стандарта

blockquote>

. Вы можете посмотреть это с помощью модуля locale :

>>> locale.nl_langinfo(locale.RADIXCHAR)
'.'

или

>>> locale.localeconv()['decimal_point']
'.'

Используя это, ваш код может стать:

import locale
_locale_radix = locale.localeconv()['decimal_point']

def read_float_with_comma(num):
    if _locale_radix != '.':
        num = num.replace(_locale_radix, ".")
    return float(num)

. Еще лучше, у того же модуля есть функция преобразования для вас, называемая atof() :

import locale

def read_float_with_comma(num):
    return locale.atof(num)
1
задан Felipe Augusto 16 January 2019 в 21:13
поделиться

2 ответа

Вы можете вычислить агрегированную сумму C по A и B, а затем объединить результирующий кадр данных с исходным

>> df
     A      B  C   D
0  foo    one  1  15
1  bar    one  2  10
2  foo    two  4  20
3  bar  three  4   5
4  foo    two  5   6
5  bar    two  6   9
6  foo    one  7   8
7  foo  three  8  15

df2 = df.groupby(['A','B']).sum().drop(['D'], axis=1).rename(columns={'C':'E'})    

>> df2
           E
A   B       
bar one    2
    three  4
    two    6
foo one    8
    three  8
    two    9

. Результат можно получить, объединив df и df2:

>> df.merge(df2.reset_index(), on=['A', 'B'], how='left')

     A      B  C   D  E
0  foo    one  1  15  8
1  bar    one  2  10  2
2  foo    two  4  20  9
3  bar  three  4   5  4
4  foo    two  5   6  9
5  bar    two  6   9  6
6  foo    one  7   8  8
7  foo  three  8  15  8
0
ответ дан Mabel Villalba 16 January 2019 в 21:13
поделиться

Если вы проверите тип столбца C, то увидите object, поскольку значения являются строками, поэтому вам необходимо преобразовать его в числовое значение, используя pandas.to_numeric например:

df['E'] = df.assign(C=pd.to_numeric(df.C)).groupby(['A', 'B'])['C'].transform('sum')
print(df)

Выход

     A      B  C   D  E
0  foo    one  1  15  8
1  bar    one  2  10  2
2  foo    two  3  20  8
3  bar  three  4   5  4
4  foo    two  5   6  8
5  bar    two  6   9  6
6  foo    one  7   8  8
7  foo  three  8  15  8
0
ответ дан Daniel Mesejo 16 January 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: