Найдите режим для столбца pandas на основе фильтрации в другом столбце pandas

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

У меня есть фрейм данных, который выглядит примерно так

 df = pd.DataFrame({'id': [1001, 1002, 1003, 1004, 1005, 1006]
                  'resolution_modified': ['It is recommended to replace scanner',
                                          'It is recommended to replace scanner',
                                          'It is recommended to replace laptop',
                                          'It is recommended to replace laptop',
                                          'It is recommended to replace printer',
                                          'It is recommended to replace printer'],
                   'cluster':[1,1,2,2,3,3]})
 

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

Это то, что я пробовал

 # Get the string that occurs the most for each unqiue cluster
mode_string = {}
for cluster in hardware['cluster'].unique():
    if hardware[hardware['cluster']==cluster]:
        mode_string[cluster] = hardware['resolution_modified'].mode()[0]
mode_string
 

Это не сработало и выдает ошибку:

 ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 

Ответ №1:

Вы можете использовать pandas.DataFrame.groupby с pandas.Series.mode :

 mode_string = df.groupby("cluster")["resolution_modified"].agg(pd.Series.mode)

#cluster
#1       It is recommended to replace scanner
#2       It is recommended to replace laptop
#3       It is recommended to replace printer
 

Вы также можете преобразовать его в dict

 mode_string = mode_string.to_dict()

#{1: 'It is recommended to replace scanner', 2: 'It is recommended to replace laptop', 3: 'It is recommended to replace printer'}
 

В обоих случаях вы можете сделать:

 mode_string[1]
#'It is recommended to replace scanner'
 

Ответ №2:

Способ pandas сделать это — сгруппировать по кластерам и найти режим resolution_modified:

 res = df.groupby('cluster')['resolution_modified'].agg(pd.Series.mode)
mode_string = res.to_dict()
print(mode_string)
 

Вывод

 {1: 'It is recommended to replace scanner', 2: 'It is recommended to replace laptop', 3: 'It is recommended to replace printer'}
 

Подробнее см. Документацию agg и mode .

В качестве альтернативы вы можете использовать statistics.mode:

 from statistics import mode
res = df.groupby('cluster')['resolution_modified'].agg(mode)