Подсчет максимального количества строк после применения groupby () - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующий фрейм данных - FileName PageNo LineNo Name Class_par_ratio 17973375 - 1 TM000010 82 POWDERS MILK 17973375 - 1 TM000015 49 milk MILK 17973375 - 1 TM000015 49 Dairy OTHER FOODS 17973375 - 1 TM000016 11 Fat ANIMAL AND VEGETABLE OIL 17973375 - 1 TM000006 79 POWDER MILK 17973375 - 1 TM000016 9 Milk MILK

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

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

FileName      Class_par_ratio           Frequency    Max_Class     Max Freq.
17743633 - 1  OTHER FOODS               2            OTHER GOODS    4
              OTHER GOODS               4                  
17743634 - 1  MEAT                      12           MEAT           12
17743634 - 2  MEAT                       1           MEAT            1
17743635 - 1  MEAT                      83           MEAT           83
              OTHER GOODS               2      
17743642 - 1  MEAT                      43           MEAT           43
              OTHER GOODS               2                  
17743739 - 1  OTHER GOODS               3            OTHER GOODS     3

Фрагменты кодов, которые я пробовал до сих пор, -

1) df.groupby(['FileName'])['Class_par_ratio'].value_counts()

Вывод, который я получаю здесь: -

FileName      Class_par_ratio
17743633 - 1  OTHER GOODS         8
17743634 - 1  MEAT AND LIVESTOCK 15
17743634 - 2  PETROLEUM           1
17743635 - 1  MEAT AND LIVESTOCK 87

Другой вывод -

2) coll_g = coll.groupby(['FileName', 'Class_par_ratio']).size().groupby(              
['FileName', 'Class_par_ratio']).agg({'count': max})
coll_g = coll_g['count'].groupby(level=0, group_keys=False)
coll_g = coll_g.nlargest(1)
coll_g

Здесь я получаю класс, вхождение которогомаксимум, но я не получаю максимум.частота №Вывод, который я получаю -

17743754 - 1  MEAT & LIVESTOCK            1
17743759 - 1  ANIMAL AND VEGETABLE OIL    1
17743970 - 1  IRON ORE                    1
17743996 - 1  OTHER GOODS                 1

Я использую Pandas .20 и python 3.6.3

Можете ли вы, ребята, подсказать мне, где я ошибаюсь и каким должен быть мой код.

Ответы [ 2 ]

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

К сожалению, требования изменились, и столбцы, которые я хотел, были - FileName, Class_par_ratio, Confidence. Здесь доверие - не что иное, как ((freq / max_freq) * 100) Если значение больше 80, товыход ВЫСОКИЙ.Если значение находится в диапазоне 60-80, выведите MEDIUM, иначе LOW.вывод будет выглядеть так -

FileName        COMM_CODE           Confidence
17743633 - 1    OTHER GOODS         MEDIUM
17743634 - 1    MEAT & LIVESTOCK    HIGH
17743634 - 2    MEAT & LIVESTOCK    HIGH
17743635 - 1    MEAT & LIVESTOCK    HIGH

Ниже приведен код, который я написал, чтобы получить к этому выводу -

mf = (df.groupby(['FileName'])['COMM_CODE'].value_counts().reset_index(name='Freq'))
we = mf.groupby(['FileName'])['Freq'].apply(lambda grp: grp.nlargest(6).sum()).reset_index(name='Tot')
mf = mf.groupby(['FileName']).first().reset_index()

mf['Confidence_%'] = (mf['Freq']/we['Tot'])*100

mf['Confidence'] = ['HIGH' if x >= 80.0 else 'MEDIUM' if x>=60.0 else 'LOW' for x in mf['Confidence_%']]
mf.drop(['Freq','Confidence_%'],axis=1,inplace=True)
0 голосов
/ 25 мая 2018

Используйте agg от idxmax, что возвращает максимальную категорию, поскольку до set_index и max до нового DataFrame, а затемjoin к оригиналу DataFrame:

df = df.groupby(['FileName'])['Class_par_ratio'].value_counts().reset_index(name='Freq')

df1 = df.set_index('Class_par_ratio').groupby(['FileName'])['Freq'].agg(['idxmax','max'])

d = {'idxmax':'Max_Class','max':'Max Freq.'}
df = df.join(df1, on='FileName').rename(columns=d)

Или используйте двойное transform:

df = df.groupby(['FileName'])['Class_par_ratio'].value_counts().reset_index(name='Freq')

g = df.set_index('Class_par_ratio').groupby(['FileName'])['Freq']
df['Max_Class'] = g.transform('idxmax').values
df['Max Freq.'] = g.transform('max').values
print (df)
       FileName           Class_par_ratio  Freq Max_Class  Max Freq.
0  17973375 - 1                      MILK     4      MILK          4
1  17973375 - 1  ANIMAL AND VEGETABLE OIL     1      MILK          4
2  17973375 - 1               OTHER FOODS     1      MILK          4

Проверочное решение для данных второго образца:

df1 = df.set_index('Class_par_ratio').groupby(['FileName'])['Frequency'].agg(['idxmax','max'])
d = {'idxmax':'Max_Class','max':'Max Freq.'}
df = df.join(df1, on='FileName').rename(columns=d)
print (df)
       FileName Class_par_ratio  Frequency    Max_Class  Max Freq.
0  17743633 - 1      OTHE FOODS          2  OTHER GOODS          4
1  17743633 - 1     OTHER GOODS          4  OTHER GOODS          4
2  17743634 - 1            MEAT         12         MEAT         12
3  17743634 - 2            MEAT          1         MEAT          1
4  17743635 - 1            MEAT         83         MEAT         83
5  17743635 - 1     OTHER GOODS          2         MEAT         83
6  17743642 - 1            MEAT         43         MEAT         43
7  17743642 - 1     OTHER GOODS          2         MEAT         43
8  17743739 - 1     OTHER GOODS          3  OTHER GOODS          3

Если необходимо удалить дублирующиеся значения, добавьте duplicated с mask:

cols = ['Max_Class','Max Freq.']
df[cols] = df[cols].mask(df['FileName'].duplicated())
print (df)
       FileName Class_par_ratio  Frequency    Max_Class  Max Freq.
0  17743633 - 1      OTHE FOODS          2  OTHER GOODS        4.0
1  17743633 - 1     OTHER GOODS          4          NaN        NaN
2  17743634 - 1            MEAT         12         MEAT       12.0
3  17743634 - 2            MEAT          1         MEAT        1.0
4  17743635 - 1            MEAT         83         MEAT       83.0
5  17743635 - 1     OTHER GOODS          2          NaN        NaN
6  17743642 - 1            MEAT         43         MEAT       43.0
7  17743642 - 1     OTHER GOODS          2          NaN        NaN
8  17743739 - 1     OTHER GOODS          3  OTHER GOODS        3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...