pandot pivot_table агрегирует по столбцу с логическими значениями - PullRequest
0 голосов
/ 21 мая 2018

У меня есть a df, который выглядит следующим образом:

code    y_m       has_id     
1000    201701    True
1000    201701    False
1000    201702    True
1000    201702    True
2000    201701    True
2000    201701    False
2000    201702    False
2000    201702    False
2000    201702    True

Я сначала сгруппировал code и y_m, чтобы вычислить процент значений True в каждой группе,

df.groupby(['code', 'y_m'])['has_id'].apply(lambda x: np.sum(x) / len(x)).reset_index(name='pct_with_id')

и затем я также хочу получить матрицу типа

      0     1     2             3              
 0   -1     0    201701       201702       
 1   0     0.56   0.5          0.6 
 2   1000  0.75   0.5          1.0   
 3   2000  0.4    0.5          0.33

-1 представляет собой фиктивное значение, которое указывает, что либо значение не существует для конкретной ячейки кода / y_m, либо для поддержки матрицыформы;0 представляет процент True для всех code или y_m или code и y_m, например, ячейка (1,1) - это процент True для всех строк в df;(1,2) - это процент True для 201701 в 1000 и 2000 в df.

. Можно ли использовать pivot_table для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы можете получить что-то похожее, используя pivot_table

dd = pd.pivot_table(
    df, 
    values='has_id', 
    index='code',  
    columns='y_m', 
    margins=True, 
    aggfunc=lambda x: np.sum(x)/len(x)
)
# dd outputs:
y_m   201701    201702       All
code
1000     0.5  1.000000  0.750000
2000     0.5  0.333333  0.400000
All      0.5  0.600000  0.555556

Доступ к элементам можно получить, используя обычный метод доступа панд.примеры:

dd.loc[1000, 'All']
# 0.75
dd.loc[1000, 201702]
# 1.0
dd.loc['All', 'All]
# 0.5555555555555556
0 голосов
/ 21 мая 2018

Для того, чтобы pivot_table работал, вам понадобится еще один столбец, в котором указан процент True для pct_with_id.Тогда вы можете указать values=pct_with_id, columns=['y_m'], index=['code'].Возможно, вам понадобится сделать новую запись в коде, такую ​​как 0, чтобы охватить ваш первый случай True для всех строк.

...