Изменение формы фрейма данных и агрегирование значений - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть фрейм данных с тремя разными столбцами, A, B и C. Я применил группу с помощью команды к столбцам A, B и C. Я также посчитал нет. рядов обладает каждая группа из трех значений.

Результирующие данные: enter image description here

Теперь я хочу сделать 0 и 1 (значения ячеек в столбце C) самими столбцами. Также я хочу добавить их и отобразить их сумму в отдельном столбце (рядом с 0 и 1 столбцами). Желаемый вывод:

A       B       Count0     Count1   Sum of Counts   Count1/Sum of Counts
1000    1000    38         538         567              538/567
1000    1001    9          90          99               90/99
1000    1002    8          16          24               16/24
1000    1003    2          10          12               10/12

(Я не активный пользователь Python. Я много искал по этому вопросу, но, похоже, не могу найти нужные слова для его поиска) Если я научусь делать сумму счетчиков 0 и 1 и отображаться рядом с другими столбцы в кадре данных, я сделаю разделение самостоятельно.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Используйте SeriesGroupBy.value_counts или size с unstack:

df = pd.DataFrame({
    'A': [1000] * 10,
    'B': [1000] * 2 + [1001] * 3 + [1002] * 5, 
    'C':[0,1] * 5
})
print (df)
      A     B  C
0  1000  1000  0
1  1000  1000  1
2  1000  1001  0
3  1000  1001  1
4  1000  1001  0
5  1000  1002  1
6  1000  1002  0
7  1000  1002  1
8  1000  1002  0
9  1000  1002  1

df = df.groupby(['A','B'])['C'].value_counts().unstack(fill_value=0).reset_index()

#another solution
#df = pd.crosstab([df['A'], df['B']], df['C']).reset_index()
#solution 2
#df = df.groupby(['A','B','C']).size().unstack(fill_value=0).reset_index()

print (df)
C     A     B  0  1
0  1000  1000  1  1
1  1000  1001  2  1
2  1000  1002  2  3

А затем сложите и поделите:

df = df.rename(columns={0:'Count0',1:'Count1'})
df['Sum of Counts'] = df['Count0'] + df['Count1']
df['Count1/Sum of Counts'] = df['Count1'] / df['Sum of Counts']
print (df)
C     A     B  Count0  Count1  Sum of Counts  Count1/Sum of Counts
0  1000  1000       1       1              2              0.500000
1  1000  1001       2       1              3              0.333333
2  1000  1002       2       3              5              0.600000
0 голосов
/ 05 ноября 2018

Попробуйте:

df1 = df.pivot_table(values='counts', index=['A', 'B'], columns=['C'], aggfunc='sum', fill_value=None, margins=True, dropna=True, margins_name='Sum of Counts').reset_index()
df1 = df1.rename(columns={0:'Count0',1:'Count1'})
df1['Count1/Sum of Counts'] = df1['Count1'] / df1['Sum of Counts']

Вы можете сделать reset_index(), чтобы структурировать его лучше. Кроме того, Count1/Sum of Counts это просто df['Count1'] / df['Sum of Counts']

...