Панды - группировка столбцов на основе других столбцов и добавление их в новый столбец - PullRequest
0 голосов
/ 06 апреля 2019

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

Например:

Parent_ID и Child ID связаны и определяюткто связан с кем в иерархическом дереве.

Фрейм данных выглядит (вход из файла csv)

No  Name    ID  Parent_Id
1   Tom     211 111
2   Galie   209 111
3   Remo    200 101
4   Carmen  212 121
5   Alfred  111 191
6   Marvela 101 111
7   Armin   234 101
8   Boris   454 109
9   Katya   109 323

Я хотел бы сгруппировать этот фрейм данных на основе идентификатора и Parent_IDв приведенной ниже группировке и создайте из этого CSV-файлы на основе родительского элемента верхнего уровня.То есть Alfred.csv, Carmen.csv (будет иметь только свою собственную запись, ледяная строка # 4), Katya.csv с использованием функции to_csv ().

Alfred
  |_ Galie
   _ Tom
   _ Marvela
       |_ Remo
        _ Armin
Carmen
Katya
  |_ Boris

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

No  Name    ID  Parent_Id   Tag
1   Tom     211 111     Alfred
2   Galie   209 111     Alfred
3   Remo    200 101     Marvela, Alfred
4   Carmen  212 121 
5   Alfred  111 191 
6   Marvela 101 111     Alfred
7   Armin   234 101     Marvela, Alfred
8   Boris   454 109     Katya
9   Katya   109 323

Обратите внимание, что имена могут повторяться, но идентификатор будет уникальным.

Пожалуйста, дайте мне знать, как этого добиться с помощью панд.Я попробовал groupby (), но кажется немного сложным и не понимаю, что я намереваюсь.Должен быть один файл для каждого родителя, и дочерние записи в родительском файле.Если у ребенка есть другой ребенок (например, marvel), он может иметь собственный файл csv.

И конечный результат будет

Alfred.csv - All records matching Galie, Tom, Marvela
Marvela.csv - All records matching Remo, Armin
Carmen.csv - Only record matching carmen (row)
Katya.csv - all records matching katya, boris

1 Ответ

0 голосов
/ 06 апреля 2019

Я принимаю ваш фрейм данных в качестве словаря:

mydf = ({"No":[1,2,3,4,5,6,7,8,9],"Name":["Tom","Galie","Remo","Carmen","Alfred","Marvela","Armin","Boris","Katya"],
        "ID":[211,209,200,212,111,101,234,454,109],"Parent_Id":[111,111,101,121,191,111,101,109,323]})
df = pd.DataFrame(mydf)

Затем я идентифицирую Parent_Id из каждой строки. Окончательно сохранили их в новом столбце:

tag = []
for z in df['Parent_Id']:
    try:
        tag.append(df.query('ID==%s'%z)['Name'].item())
    except:
        tag.append('')
df['Tag'] = tag

Для фильтрации кадра данных на основе значения в столбце Tag, например, Alfred

df[df['Tag'].str.match('Alfred')]

Затем сохраните его в файле csv. Повторите для других значений. В качестве альтернативы, если в столбце Tag имеется большое количество имен, используйте цикл for.

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