Как разделить данные по разным классам в Python 3.6 - PullRequest
0 голосов
/ 10 мая 2018

, так как у меня есть набор данных, выглядит следующим образом:


CLASS, value1
  A,     1
  A,    2
  A,     3
  A,     5
  B,     4
  B,     1
  B,     2
  C,     1
  C,     5

, и я хотел бы разбить набор данных по классу CLASS на несколько поднаборов данных.

длясейчас я делаю это один за другим:


datasetA = dataset.iloc[0:4, :].values

datasetB = dataset.iloc[4:7, :].values

но, поскольку существуют тысячи различных КЛАССОВ, я надеюсь, что есть какая-то функция, которая поможет мне сделать это.

Я обнаружил, что groupby может помочь, но еще не понял, как его применить.Любое предложение или решение, пожалуйста?

Ответы [ 4 ]

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

На мой взгляд, здесь лучше всего создать dictionary of Dataframes с groupby:

dfs = dict(tuple(df.groupby('CLASS')))
print (dfs)
{'A':   CLASS  value1
0     A       1
1     A       2
2     A       3
3     A       5, 'B':   CLASS  value1
4     B       4
5     B       1
6     B       2, 'C':   CLASS  value1
7     C       1
8     C       5}

dfa = dfs['A']
print (dfa)
  CLASS  value1
0     A       1
1     A       2
2     A       3
3     A       5

dfc = dfs['C']
print (dfc)
  CLASS  value1
7     C       1
8     C       5
0 голосов
/ 10 мая 2018

Если ваш набор данных - это просто текстовый файл, и вы хотите прочитать из этого текстового файла, вот что я хотел бы сделать. Но я храню их в словаре, поскольку я не знаю, какие команды iloc вы используете, чтобы быть честными. Но если вам не обязательно делать это с этими командами, я думаю, что то, что я предлагаю, делает работу.

a_dictionary = {}
with open('my_file.txt', 'r') as my_file:
    next(my_file)
    for line in my_file:
        line = line.strip()
        key = line.split(',')[0]
        key = key.strip()
        value = line.split(',')[1]
        value = value.strip()
        a_dictionary[key] = a_dictionary.get(key, [])
        a_dictionary[key].append(value)

Если вы печатаете результат:

print(a_dictionary)

Вывод:

{'C': ['1', '5'], 'A': ['1', '2', '3', '5'], 'B': ['4', '1', '2']}

Надеюсь, я отвечаю на вопрос!

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

Если вы знаете свои группы заранее, вы можете использовать следующее:

datasetA, datasetB, datasetC = (g for _,g in df.groupby('CLASS'))
0 голосов
/ 10 мая 2018

Для большинства приложений ваш groupby объект, возвращаемый df.groupby('CLASS') , представляет собой вашу коллекцию отдельных наборов данных, и существует множество способов выполнять сложные манипуляции с groupby объектом в pandas(см. две ссылки внизу этого поста).

Однако, если вы хотите сделать это явно и иметь доступ к каждому набору данных в отдельности, одним из способов сделать это было бы разбиение вашего groupby на словарь наборов данных путем итерации по вашему groupby:

datasets = {}
by_class = df.groupby('CLASS')

for groups, data in by_class:
    datasets[groups] = data

Затем вы можете получить доступ к каждому отдельному набору данных, как если бы вы обращались к любому значению в словаре:

>>> datasets['A']
  CLASS  value1
0     A       1
1     A       2
2     A       3
3     A       5
>>> datasets['B']
  CLASS  value1
4     B       4
5     B       1
6     B       2
>>> datasets['C']
  CLASS  value1
7     C       1
8     C       5

Или вы можете использовать метод GroupBy.get_group():

by_class = df.groupby('CLASS')

>>> by_class.get_group('A')

  CLASS  value1
0     A       1
1     A       2
2     A       3
3     A       5

В любом случае, безусловно, стоит прочитать this и this , чтобы понять, что такое groupby и как вы можете применить его к своей задаче

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