, потому что я не знаю настройки языкового стандарта
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)
Вы можете вычислить агрегированную сумму 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
Если вы проверите тип столбца 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