Zacznę 3 prostych przykładów:Dlaczego grupa nie sumuje konwersji boolean na int lub float?
pd.DataFrame([[True]]).sum()
0 1
dtype: int64
pd.DataFrame([True]).sum()
0 1
dtype: int64
pd.Series([True]).sum()
1
Wszystkie one są, jak oczekiwano. Oto bardziej skomplikowany przykład.
df = pd.DataFrame([
['a', 'A', True],
['a', 'B', False],
['a', 'C', True],
['b', 'A', True],
['b', 'B', True],
['b', 'C', False],
], columns=list('XYZ'))
df.Z.sum()
4
Również zgodnie z oczekiwaniami. Jednak gdybym groupby(['X', 'Y']).sum()
spodziewałem się, że wyglądają jak:
myślę błąd. Czy istnieje inne wytłumaczenie?
za odpowiedź @ unutbu za
pandy próbuje przekształcić jako oryginalne dtypes. Pomyślałem, że może grupa, którą wykonałem, nie podzieliła się niczym. Próbowałem tego przykładu, aby przetestować ten pomysł.
df = pd.DataFrame([
['a', 'A', False],
['a', 'B', False],
['a', 'C', True],
['b', 'A', False],
['b', 'B', False],
['b', 'C', False],
], columns=list('XYZ'))
będę groupby('X')
i sum
. Jeśli @unutbu jest poprawna, kwoty te powinny być 1
i 0
i są castable do bool
zatem powinniśmy zobaczyć bool
df.groupby('X').sum()
Rzeczywiście ... bool
Ale jeśli proces jest taki sam, ale wartości są nieco inne.
df = pd.DataFrame([
['a', 'A', True],
['a', 'B', False],
['a', 'C', True],
['b', 'A', False],
['b', 'B', False],
['b', 'C', False],
], columns=list('XYZ'))
df.groupby('X').sum()
lekcja. Zawsze używaj astype(int)
lub czegoś podobnego, kiedy to robisz.
df.groupby('X').sum().astype(int)
daje spójne wyniki dla każdego scenariusza.
Prawdopodobnie nazwałbym to również błędem, zwłaszcza, że dostajesz to, czego się spodziewasz po 'df ['Z'] = df ['Z']. Astype (int)'. Idź i zgłoś to i sprawdź, czy twórcy 'pand' mają powód takiego zachowania. –
Dzieje się tak, ponieważ ['_cython_agg_blocks'] (https://github.com/pydata/pandas/blob/master/pandas/core/groupby.py#L3128) wywołuje' _try_coerce_and_cast_result', który wywołuje ['_try_cast_result'] (https: //github.com/pydata/pandas/blob/master/pandas/core/internals.py#L536), który próbuje zwrócić wynik * tego samego dtype * jako oryginalne wartości (w tym przypadku 'bool'). – unutbu
@unutbu Widzę zalety tej decyzji. Wydaje się jednak, że podczas korzystania z agregacji grupowej zawsze powinniśmy rzutować jako typ, jakiego oczekujemy. Pytanie, czy mógłbyś zamieścić to jako odpowiedź, więc wydaje się, że odpowiedź została udzielona? Dzięki! – piRSquared