2016-08-04 1 views
2

Я делаю сводную таблицу с использованием панд. Если я установил aggfunc=sum или aggfunc=count в столбце с булевыми значениями, он отлично работает, если в столбце есть хотя бы один номер True. Например. [True, False, True, True, False] вернется 3. Однако, если все значения равны False, тогда сводная таблица выводит False вместо 0. Независимо от того, что я не могу обойти. Единственный способ, которым я могу обойти его, чтобы определить функцию следующим образом:Pandas Pivot Table Keeps False Вместо 0

def f(x): 
    mySum = sum(x) 
    return "0" if mySum == 0 else mySum 

, а затем установить aggfunc=lambda x: f(x). Хотя это работает визуально, меня все еще беспокоит, что вывод string - единственный способ, которым я могу получить 0. Если я передам его как int или попытаюсь вернуть 0.0 или сделать что-то цифровое вообще, то всегда получается результат False.

Почему это и как получить сводную таблицу, чтобы на самом деле дать мне 0 в этом случае (только путем изменения aggfunc, а не самого блока данных)?

+1

Пожалуйста, пост пример DataFrame. – Alex

ответ

3
df = pd.DataFrame({'count': [False] * 12, 'index': [0, 1] * 6, 'cols': ['a', 'b', 'c'] * 4}) 
print(df) 

выходы

cols count index 
0  a False  0 
1  b False  1 
2  c False  0 
3  a False  1 
4  b False  0 
5  c False  1 
6  a False  0 
7  b False  1 
8  c False  0 
9  a False  1 
10 b False  0 
11 c False  1 

Вы можете использовать astype (docs) для приведения в int до того поворота.

res = df.pivot_table(values='count', aggfunc=np.sum, columns='cols', index='index').astype(int) 
print(res) 

выходы

cols a b c 
index   
0  0 0 0 
1  0 0 0 
+0

спасибо, что делает работа. Однако моя программа не может изменить фрейм данных (по причинам, которые я не буду здесь делать). Достаточно сказать, что мое решение должно полагаться только на aggfunc. Знаете ли вы способ сделать это, не меняя данные? – Elliptica

+0

@Elliptica Конечно, просто переместите вызов 'astype' к результату. Ответ обновлен. – Alex

+0

Это работает отлично! Спасибо :) – Elliptica