Мне нужен способ поиска в панде сгруппированных данных - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть набор данных, подобный следующему в файле Excel с именем data.xlsx

Building           name    salary
00Apple032           Bob     50000
00Apple032           James   30000
0Bean032            James   30000
0Soda987            Alex    0
0Bean032            Bryon   32000

Я создал два фрейма данных из данных.

df = pd.read_excel('data.xlsx', sheet_name='Sheet1, dtype=str)

grouped_df = pd.read_excel('data.xlsx', sheet_name='Sheet1, dtype=str)
grouped = grouped_df.groupby("Building")[["Building", "name", "salary']]

Прежде чем я уйдуздесь .. причина, по которой я создал исходный df, а также grouped_df (оба являются фреймами данных) ... Я не уверен, что применяя функцию группировки к исходному df и назначая ее новой переменной для одногоСтрока кода (как в приведенной ниже строке) будет как-то портить исходные данные и создавать проблемы в дальнейшем.Это может быть неточным.

grouped = df.groupby("Builing")[["Building", "name", "salary']]

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

pandas.core.groupby.groupby.DataFrameGroupBy

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

x = input("search for: ")
df[df['Building'].str.contains(x)]]

однако на сгруппированном кадре данных это не работает.

Моя проблема в том, что я пытаюсь обойти это, - мне нужно разрешить возможность поиска в этом сгруппированном фрейме данных для печати групп, но пользователь не знает точного или точного имени группы.Я ищу яблоки?Или 00Apples .. вы можете увидеть проблему.

Хотя я могу запрашивать данные следующим образом:

grouped.get_group('00Apples032')

У меня нет способа предложить кому-то возможность искать эту группу с помощью чего-то вроде str.contains.

Что я пробовал

grouped[grouped["Building"].str.contains("Apples")]

ОШИБКА

exception: Columns already selected  

1 Ответ

0 голосов
/ 29 ноября 2018

Предполагается, что вы сгруппировали исходный фрейм данных на Building:

grouped = df.groupby("Building")

. Это создаст объект groupby.Вы можете зациклить этот объект, как показано ниже:

for key, value in grouped:
    print(key, value)
    ## Do your stuff here

00Apple032
     Building   name  salary
0  00Apple032    Bob   50000
1  00Apple032  James   30000
0Bean032
   Building   name  salary
2  0Bean032  James   30000
4  0Bean032  Bryon   32000
0Soda987
   Building  name  salary
3  0Soda987  Alex       0

В этом случае key будет иметь уникальные имена Buidling, такие как 00Apple032, 0Bean032 и т. Д., Как показано выше.И, value будет иметь действительные строки для каждого ключа.

Таким образом, вы можете рассматривать каждый (key,value) как один кадр данных и проверять, имеет ли каждый кадр данных x или нет, как это:

for key, value in grouped:
    print(value[value['Building'].str.contains(x)])
    ## do more stuff

Дайте мне знать, если это поможет.

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