Pandas Pivot Table Вложенный Aggfunc - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь создать сводную таблицу, которая подсчитывает количество форм и сумму, среднее значение и медиану из этого числа. Однако d-тип форм является категоричным, и я не могу использовать средние и медианные функции для нечисловых значений.

Я хочу использовать «Тип формы»: считать в качестве значения для агрегирования.

Я бы получил эту ошибку, если бы я включил среднее значение в первом aggfunc

DataError: No numeric types to aggregate

Есть ли способ вложить aggfuncts в сводные таблицы или изменить dtype при создании сводной таблицы?

Я пытался использовать .astype (int), но я не могу понять синтаксис этой функции.

Фиктивный код ниже не совсем точен, но яможет продолжать работать над ним.

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar"],
                   "B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],
                   "C": ["105319", "1271075", "84565", "84354", "54835", "81638", "1282224", "41856", "78987"],
                   "Form Type": ["144", "D", "D/A", "144", "D", "D", "D", "S-1","D"]})
table = pd.pivot_table(df, columns = ['Form Type'],
                       index=['A', 'B', 'C'],
                       fill_value =' ', 
                       aggfunc={'Form Type': ['count']})

Вывод выглядит примерно так:

enter image description here

1 Ответ

0 голосов
/ 08 октября 2019

Используйте .value_counts() для подсчета Form Type:

  • Предполагается, что вы запрашиваете значения Form Type, а затем вам нужны mean, median и sum из counts
import pandas as pd

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar"],
                   "B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],
                   "C": ["105319", "1271075", "84565", "84354", "54835", "81638", "1282224", "41856", "78987"],
                   "Form Type": ["144", "D", "D/A", "144", "D", "D", "D", "S-1","D"]})


counts = df['Form Type'].value_counts().rename_axis('Form Type').reset_index(name='counts')

Form Type  counts
        D       5
      144       2
      S-1       1
      D/A       1

counts['counts'].agg(['mean', 'median', 'sum'])

# Output:
mean      2.25
median    1.50
sum       9.00
Name: counts, dtype: float64

Альтернатива:

  • Если вы хотите получить .value_counts на основе groupby
grouped_counts = df.groupby(['A', 'B'])['Form Type'].value_counts().rename_axis(['A', 'B', 'Form Type']).reset_index(name='counts')

   A    B Form Type  counts
 bar  one         D       2
 bar  two         D       1
 bar  two       S-1       1
 foo  one       144       1
 foo  one         D       1
 foo  one       D/A       1
 foo  two       144       1
 foo  two         D       1

grouped_counts_stats = grouped_counts.groupby(['A', 'B', 'Form Type'])['counts'].agg(['mean', 'median', 'sum'])

enter image description here

...