Python - Поворот и создание гистограмм из столбца Pandas, с пропущенными значениями - PullRequest
0 голосов
/ 16 сентября 2018

Имея следующий фрейм данных:

   name  value  count  total_count
0     A      0      1           20
1     A      1      2           20
2     A      2      2           20
3     A      3      2           20
4     A      4      3           20
5     A      5      3           20
6     A      6      2           20
7     A      7      2           20
8     A      8      2           20
9     A      9      1           20
----------------------------------
10    B      0     10           75
11    B      5     30           75
12    B      6     20           75
13    B      8     10           75
14    B      9      5           75

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

Пояснение : у меня есть 10 возможных значений, диапазон 0-9, не все значения присутствуют в каждой группе.В приведенном выше примере группы B отсутствуют значения 1,2,3,4,7.Я хотел бы создать гистограмму с 5 бинами, игнорировать пропущенные значения и рассчитать процентное значение для каждого бина.Таким образом, результат будет выглядеть так:

  name       0-1  2-3  4-5  6-7       8-9
0    A  0.150000  0.2  0.3  0.2  0.150000
1    B  0.133333  0.0  0.4  0.4  0.066667

Например, для bin 0-1 группы A вычисление является суммой подсчета для значений 0, 1 (1 + 2), деленное на total_count группы A

  name       0-1
0    A       (1+2)/20 = 0.15

Я изучал гистологический метод и этот вопрос StackOverflow , но все еще пытается выяснить, каков правильный подход.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Чтобы получить точный результат, вы можете попробовать это.

bins=range(10)
res = df.groupby('name')['count'].sum()
intervals = pd.cut(df.value, bins=bins, include_lowest=True)
df1 = (df.groupby([intervals,"name"])['count'].sum()/res).unstack(0)

df1.columns = df1.columns.astype(str)  # convert the cols to string
df1.columns = ['a','b','c','d','e','f','g','h','i']  # rename the cols
cols = ['a',"b","d","f","h"]

df1 = df1.add(df1.iloc[:,1:].shift(-1, axis=1), fill_value=0)[cols]
print(df1)

Вы можете вручную переименовать столбцы позже.

# Output:
           a         b     d        f        h 
name                    
   A    0.150000    0.2   0.3   0.200000    0.15
   B    0.133333    NaN   0.4   0.266667    0.20

Вы можете заменить значения NaN, используя df1.fillna("0.0")

0 голосов
/ 16 сентября 2018

Используйте pd.cut для привязки вашей функции, затем используйте df.groupby().count() и метод .unstack() для получения искомого кадра данных.Во время группы вы можете использовать любую функцию агрегирования (.sum (), .count () и т. Д.), Чтобы получить результаты, которые вы ищете.Код ниже работает, если вы ищете пример.

import pandas as pd
import numpy as np

df = pd.DataFrame(
    data ={'name': ['Group A','Group B']*5,
           'number': np.arange(0,10), 
           'value': np.arange(30,40)})
df['number_bin'] = pd.cut(df['number'], bins=np.arange(0,10))
# Option 1: Sums
df.groupby(['number_bin','name'])['value'].sum().unstack(0)
# Options 2: Counts
df.groupby(['number_bin','name'])['value'].count().unstack(0)

Нулевые значения в исходных данных не влияют на результат.

...