Как мне манипулировать большим набором данных в меньшие наборы в зависимости от типа объекта в данных? - PullRequest
0 голосов
/ 01 ноября 2019

В моем коде пользователь вводит текстовый файл. Текстовый файл содержит 4 столбца, и количество строк будет зависеть от загруженного текстового файла, поэтому код должен быть общим . Первый столбец массива, сгенерированный из текстового файла, содержит тип животного, второй столбец - его Xlocation в поле, третий - его Ylocation в поле, а четвертый - Zlocation животных в поле. Загрузка данных Если вы не хотите переходить по ссылке на изображение данных, вот копия кода, загружающего данные и возвращаемый массив:

#load the data
emplaced_animals_data = np.genfromtxt('animal_data.txt', skip_header = 1, dtype = str)
print(type(emplaced_animals_data))
print(emplaced_animals_data)

[['butterfly' '1' '1' '3']
 ['butterfly' '2' '2' '3']
 ['butterfly' '3' '3' '3']
 ['dragonfly' '4' '1' '1']
 ['dragonfly' '5' '2' '1']
 ['dragonfly' '6' '3' '1']
 ['cat' '4' '4' '2']
 ['cat' '5' '5' '2']
 ['cat' '6' '6' '2']
 ['cat' '7' '8' '3']
 ['elephant' '8' '9' '3']
 ['elephant' '9' '10' '4']
 ['elephant' '10' '10' '4']
 ['camel' '10' '11' '5']
 ['camel' '11' '6' '5']
 ['camel' '12' '5' '6']
 ['camel' '12' '3' '6']
 ['bear' '13' '13' '7']
 ['bear' '5' '15' '7']
 ['bear' '4' '10' '5']
 ['bear' '6' '9' '2']
 ['bear' '15' '13' '1']
 ['dog' '1' '3' '9']
 ['dog' '2' '12' '8']
 ['dog' '3' '10' '1']
 ['dog' '4' '8' '1']]

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

#Removes unwanted animals from list
print('Original list:', emplaced_animals_data[:,0])
all_the_animals = list(emplaced_animals_data[:,0])
Butterfly = set('butterfly')
Dragonfly = set('dragonfly')

for i in range(0, len(emplaced_animals_data)):
    for animal in all_the_animals:
        if Butterfly == set(animal):
            all_the_animals.remove(animal)
        if Dragonfly == set(animal):
            all_the_animals.remove(animal)
print('Updated list:', words)

Далее я хотел бы взять оставшихся животных и отсортировать каждое животное вместе с данными о его местонахождении в свой собственный массив, который будет сохранен как некоторая переменная, нов настоящее время я могу только сортировать типы животных в их собственные массивы. Как бы я расширил свой выбор животных, чтобы включить их местоположения, а также сохранить животных и их местоположения в их собственный массив в зависимости от типа животного? Группировка животных

#Groups all of the items with the same name together
setofanimals = set(all_the_animals)

animal_groups = {}

for one in setofanimals:
    ids = [one for i in emplaced_animals_data[:,0] if i == one]
    animal_groups.update({one:ids})

for one in animal_groups:
    print(one, ":", animal_groups[one])

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

Вот данные, с которыми я работаю, скопированные из ExcelЭлектронная таблица, которую я сохранил в виде текстового файла:

Данные

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Следующие функции должны выполнить это. Ваш вводимый текст может быть произвольной длины, и обе функции принимают список животных для удаления или выбора на основе животных, содержащихся в указанном списке:

import numpy as np

# note that my delimiter is a tab, which might be different from yours
emplaced_animals = np.genfromtxt('animals.txt', skip_header=1, dtype=str, delimiter='   ')
listed_animals = ['cat', 'dog', 'bear', 'camel', 'elephant']

def get_specific_animals_from(list_of_all_animals, specific_animals):
    """get a list only containing rows of a specific animal"""
    list_of_specific_animals = np.array([])
    for specific_animal in specific_animals:
        for animal in list_of_all_animals:
            if animal[0] == specific_animal:
                list_of_specific_animals = np.append(list_of_specific_animals, animal, 0)
    return list_of_specific_animals

def delete_specific_animals_from(list_of_all_animals, bad_animals):
    """
    delete all rows of bad_animal in provided list
    takes in a list of bad animals e.g. ['dragonfly', 'butterfly']
    returns list of only desired animals
    """
    all_useful_animals = list_of_all_animals
    positions_of_bad_animals = []
    for n, animal in enumerate(list_of_all_animals):
        if animal[0] in bad_animals:
            positions_of_bad_animals.append(n)
    if len(positions_of_bad_animals):
        for position in sorted(positions_of_bad_animals, reverse=True):
            # reverse is important
            # without it, list positions change as you delete items
            all_useful_animals = np.delete(all_useful_animals, (position), 0)
    return all_useful_animals

emplaced_animals = delete_specific_animals_from(emplaced_animals, ['dragonfly', 'butterfly'])

list_of_elephants = get_specific_animals_from(emplaced_animals, ['elephant'])

list_of_needed_animals = get_specific_animals_from(emplaced_animals, listed_animals)
0 голосов
/ 05 ноября 2019

Я не знаю, если это именно то, что вы хотите, но посмотрите на это. Прежде всего, относительно вашего комментария, возможно, вам придется изменить разделитель на ',' oder ';'. Код протестирован и отлично работает с текстовым файлом, разделенным запятыми

Ввод (.txt):

Animals,Xlocation,Ylocation,Zlocation
butterfly,1,1,3
butterfly,2,2,3
butterfly,3,3,3
dragonfly,4,1,1
dragonfly,5,2,1
dragonfly,6,3,1
cat,4,4,2
cat,5,5,2
cat,6,6,2
cat,7,8,3
elephant,8,9,3
elephant,9,10,4
elephant,10,10,4
camel,10,11,5
camel,11,6,5
camel,12,5,6
camel,12,3,6
bear,13,13,7
bear,5,15,7
bear,4,10,5
bear,6,9,2
bear,15,13,1
dog,1,3,9
dog,2,12,8
dog,3,10,1
dog,4,8,1

Код:

def main():
    result = readFile("C:\\Users\\Desktop\\animals.txt")
    # Array of animals to remove from main list
    to_remove = ["butterfly", "dragonfly"]

    # returns a new list with all rows except the 'to_remove animals'
    useful_animals = [one for one in result if one["Animals"] not in to_remove]

    cats = get_animal_group(useful_animals, "cat")
    camels = get_animal_group(useful_animals, "camel")

# returns a new list with all rows where animals_list match given animal
def get_animal_group(animal_list, animal):
    return [one for one in animal_list if one["Animals"] == animal]

def readFile(path):
    # From this you get a list of dict which is much easier to handle
    result = pandas.read_csv(path, encoding="utf-8",
                             usecols=["Animals", "Xlocation", "Ylocation", "Zlocation"]).to_dict("records")
    return result

Вывод:

# for animal in useful_animals:
{'Animals': 'cat', 'Xlocation': 4, 'Ylocation': 4, 'Zlocation': 2.0}
{'Animals': 'cat', 'Xlocation': 5, 'Ylocation': 5, 'Zlocation': 2.0}
{'Animals': 'cat', 'Xlocation': 6, 'Ylocation': 6, 'Zlocation': 2.0}
{'Animals': 'cat', 'Xlocation': 7, 'Ylocation': 8, 'Zlocation': 3.0}
{'Animals': 'elephant', 'Xlocation': 8, 'Ylocation': 9, 'Zlocation': 3.0}
{'Animals': 'elephant', 'Xlocation': 9, 'Ylocation': 10, 'Zlocation': 4.0}
{'Animals': 'elephant', 'Xlocation': 10, 'Ylocation': 10, 'Zlocation': 4.0}
{'Animals': 'camel', 'Xlocation': 10, 'Ylocation': 11, 'Zlocation': 5.0}
{'Animals': 'camel', 'Xlocation': 11, 'Ylocation': 6, 'Zlocation': 5.0}
{'Animals': 'camel', 'Xlocation': 12, 'Ylocation': 5, 'Zlocation': 6.0}
{'Animals': 'camel', 'Xlocation': 12, 'Ylocation': 3, 'Zlocation': 6.0}
{'Animals': 'bear', 'Xlocation': 13, 'Ylocation': 13, 'Zlocation': 7.0}
{'Animals': 'bear', 'Xlocation': 5, 'Ylocation': 15, 'Zlocation': 7.0}
{'Animals': 'bear', 'Xlocation': 4, 'Ylocation': 10, 'Zlocation': 5.0}
{'Animals': 'bear', 'Xlocation': 6, 'Ylocation': 9, 'Zlocation': 2.0}
{'Animals': 'bear', 'Xlocation': 15, 'Ylocation': 13, 'Zlocation': 1.0}
{'Animals': 'dog', 'Xlocation': 1, 'Ylocation': 3, 'Zlocation': 9.0}
{'Animals': 'dog', 'Xlocation': 2, 'Ylocation': 12, 'Zlocation': 8.0}
{'Animals': 'dog', 'Xlocation': 3, 'Ylocation': 10, 'Zlocation': 1.0}
{'Animals': 'dog', 'Xlocation': 4, 'Ylocation': 8, 'Zlocation': 1.0}

# for cat in cats:
{'Animals': 'cat', 'Xlocation': 4, 'Ylocation': 4, 'Zlocation': 2.0}
{'Animals': 'cat', 'Xlocation': 5, 'Ylocation': 5, 'Zlocation': 2.0}
{'Animals': 'cat', 'Xlocation': 6, 'Ylocation': 6, 'Zlocation': 2.0}
{'Animals': 'cat', 'Xlocation': 7, 'Ylocation': 8, 'Zlocation': 3.0}

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать (комментарий)

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...