Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для tarhanovk
1 / 1 / 0
Регистрация: 08.11.2013
Сообщений: 41

Крайне неожиданный результат применения set к списку

01.03.2023, 18:51. Показов 1311. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решаю одну задачку, пишу агрегирующую функцию для входных данных из /.csv

Безумно удивился поведению функции set для списка значений, в которых встречается NAN

Датасет:
мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pandas as pd
 
def analyzer(arr,stat,func):
    arr_dict = dict.fromkeys(set(arr),0) #ВОТ ТУТ полный пиздец получается
    if func == "min":
        for s in arr_dict.keys():
            arr_dict[s] = []
        for k in range(len(stat)):
            arr_dict[arr[k]].append(stat[k])
        for s in arr_dict.keys():
            arr_dict[s] = min(arr_dict[s])
    elif func == "max":
        for s in arr_dict.keys():
            arr_dict[s] = []
        for k in range(len(stat)):
            arr_dict[arr[k]].append(stat[k])
        for s in arr_dict.keys():
            arr_dict[s] = max(arr_dict[s])
    else:#count
        for s in arr:
            arr_dict[s]+=1
    stat_printer(arr_dict)
    return arr_dict
 
def stat_printer(stat_dict):
    for k in stat_dict.keys():
        print(k,stat_dict[k])
 
input_file = pd.read_csv("titanic.csv")
input_string = "Age Survived count"
stat_arr_name,stat_group_name, func_name = input_string.split()
 
stat_arr = input_file[stat_arr_name].tolist()
stat_group = input_file[stat_group_name].tolist()
# print(age_arr)
analyzer(stat_arr,stat_group,func_name)
Вопросы к знающим, почему такой ужас происходит - преобразование списка во множество дает в результате кучу дубликатов значений NAN
Вложения
Тип файла: 7z titanic.7z (18.5 Кб, 3 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2023, 18:51
Ответы с готовыми решениями:

Неожиданный результат
Всем привет! Написал небольшую программу: #include <iostream> using namespace std; int main() { int x, a, b; x = a + b; ...

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

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

5
 Аватар для tarhanovk
1 / 1 / 0
Регистрация: 08.11.2013
Сообщений: 41
01.03.2023, 18:52  [ТС]
Вот текст задачи если кому надо:

Дан файл "titanic.csv" в формате .csv, который можно открыть командой pd.read_csv("titanic.csv")

Каждая строка набора данных - это отдельный человек, который либо выжил, либо не выжил (столбец "Survived").

В данной задаче необходимо определить один из статистических показателей: количество, максимум, минимум - по указанной группе пассажиров, по указанному признаку. Например, найти количество представителей выживших/не выживших пассажиров ("Survived") по столбцу "Pclass".

На вход получаем: столбец по которому группируем, столбец для которого ищем статистику, название самой статистики (count, min, max)

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

Формат ввода
Survived Pclass count

Формат вывода
0 549
1 342
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
01.03.2023, 21:09
Лучший ответ Сообщение было отмечено tarhanovk как решение

Решение

tarhanovk,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# -*- coding: utf-8 -*-
"""Untitled0.ipynb
 
Automatically generated by Colaboratory.
 
Original file is located at
    https://colab.research.google.com/drive/1h4R2fzvZJ3BJNTu6uQXkMAUOqfKgaog2
"""
 
import pandas as pd
 
def analyzer(arr,stat,func):
 
    ##################
    arr = [e for e in arr if e==e] # исключение Nan из списка
    ##################
 
    arr_dict = dict.fromkeys(set(arr),0) #ВОТ ТУТ полный пиздец получается
    if func == "min":
        for s in arr_dict.keys():
            arr_dict[s] = []
        for k in range(len(stat)):
            arr_dict[arr[k]].append(stat[k])
        for s in arr_dict.keys():
            arr_dict[s] = min(arr_dict[s])
    elif func == "max":
        for s in arr_dict.keys():
            arr_dict[s] = []
        for k in range(len(stat)):
            arr_dict[arr[k]].append(stat[k])
        for s in arr_dict.keys():
            arr_dict[s] = max(arr_dict[s])
    else:#count
        for s in arr:
            arr_dict[s]+=1
    #stat_printer(arr_dict)
    return arr_dict
 
def stat_printer(stat_dict):
    for k in stat_dict.keys():
        print(k,stat_dict[k])
 
input_file = pd.read_csv("/content/drive/MyDrive/titanic.csv")
input_string = "Age Survived count"
stat_arr_name,stat_group_name, func_name = input_string.split()
 
stat_arr = input_file[stat_arr_name].tolist()
stat_group = input_file[stat_group_name].tolist()
# print(age_arr)
analyzer(stat_arr,stat_group,func_name)
 
#######################################
########### Можно так вместо кода выше:
def analizer(df, group, filter_, cols, func):
    que = f'{group} == {filter_}'
    return df.query(que).groupby(cols)[cols].agg(func).to_dict()
  
res = analizer(input_file, 'Survived', 0, 'Age', ['count']) # статистик может быть больше 1, поэтому списком
for key in res:
    for elem in res[key]:
        print(elem, res[key][elem])
0
 Аватар для tarhanovk
1 / 1 / 0
Регистрация: 08.11.2013
Сообщений: 41
01.03.2023, 21:18  [ТС]
Спасибо за решение, большое спасибо. но вы не ответили на вопрос, почему в моем коде при преобразовании массива в множество все значения NAN не сливаются в одно
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
01.03.2023, 22:34
tarhanovk, потому что Nan != Nan на этом и основано условие в 15-й строчке кода
https://ru.wikipedia.org/wiki/Нечисло

Добавлено через 1 час 9 минут
tarhanovk, По условию ТЗ
На вход получаем: столбец по которому группируем, столбец для которого ищем статистику, название самой статистики (count, min, max)

На выходе печатаем столько строк, сколько получилось после группировки по указанному столбцу. В каждой строке сначала название группы (уникальное значение столбца, по которому группировали), затем пробел, затем значение статистики для указанной группы.
Похоже так:
Python
1
2
3
4
5
6
def analizer(group, cols, func):
    df = input_file.groupby([group, cols])[cols].agg(func)
    for row in df.reset_index(level=1).itertuples():
        print(*row)
    
analizer('Survived', 'Age', ['count'])
2
740 / 622 / 151
Регистрация: 04.03.2022
Сообщений: 1,272
02.03.2023, 09:35
tarhanovk,
Bash
1
2
3
>>>> from math import nan
>>>> nan == nan
False
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2023, 09:35
Помогаю со студенческими работами здесь

Неожиданный результат программы
Проблема в том что после первой итерации в цикле (которая проходит верно) программа начинает отнимать по одному. Программа должна спросить...

Выводиться неожиданный результат
Добрый вечер! Не могли бы Вы пожалуйста пояснить. В процессе прохождения теста наткнулась на програмку public class Main { ...

Событие. Неожиданный результат
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Неожиданный результат с Core i7
может кто помнит, я создавал тему - что если для sli на gtx 660 вместо core i5 650 поставить core i7 причем в теме было мнение мол,...

Неожиданный результат toString
Проблема, с которой я столкнулся: long timestamp = System.currentTimeMillis()/1000; String query = "UPDATE `table` SET 'time' =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru