Объединить несколько строк в одну строку по значению столбца и разбить результирующий кадр данных на несколько кадров данных в зависимости от количества связанных строк - PullRequest
0 голосов
/ 19 октября 2019

У меня есть фрейм данных pandas, в котором несколько строк имеют определенное значение столбца. Для этих строк я хочу объединить эти строки в одну строку. И, кроме того, существуют вариации для числа строк со значением общего столбца, я хочу разделить эти кадры данных на их отдельный отдельный кадр данных, поэтому уникальный кадр данных для определенного числа общих строк.

Вот пример того, что я хочу.

import pandas as pd

data = [['tom', 2], ['ni2ck', 2], ['j3uli', 4] , ['nic4k', 4], ['jul5i', 4] , ['nic6k', 7], ['ju7li', 7] , ['nic8k', 7], ['ju9li', 7] , ['nic1k', 8], ['car', 8]]
df = pd.DataFrame(data, columns = ['Name', 'Age']) 
df 

Приведенный выше код генерирует, как будет выглядеть исходный кадр данных

В результате будет

Name    Age
0   tom 2
1   ni2ck   2
2   j3uli   4
3   nic4k   4
4   jul5i   4
5   nic6k   7
6   ju7li   7
7   nic8k   7
8   ju9li   7
9   nic1k   8
10  car 8

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

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

Name    Name    Age
0   tom ni2ck   2
1   nic1k   car 8

второй фрейм данных результата

Name    Name    Name    Age
0   j3uli   nic4k   jul5i   4

третий фрейм данных результата

    Name    Name    Name    Name    Age
0   nic6k   ju7li   nic8k   ju9li   7

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Вот один из способов

df['New']=df.groupby('Age').cumcount()
s=df.pivot(index='Age',columns='New',values='Name')
l=[ y.dropna(1) for _ , y in s.groupby(s.isnull().sum(1))]
l[0]
New      0      1      2      3
Age                            
7    nic6k  ju7li  nic8k  ju9li
l[1]
New      0      1      2
Age                     
4    j3uli  nic4k  jul5i
l[2]
New      0      1
Age              
2      tom  ni2ck
8    nic1k    car
1 голос
/ 19 октября 2019

Использование collections.defaultdict

from collections import defaultdict

d = defaultdict(list)

for age, df_ in df.groupby('Age'):
    d[len(df_.T.columns)].append(df_.reset_index(drop=True).T.loc[['Name']].assign(Age=age))

d = {k: pd.concat(v, ignore_index=True ) for k,v in d.items()}

Затем получите доступ к фреймам данных по количеству имён. Например,

>>> d[2]

       0      1  Age
0    tom  ni2ck    2
1  nic1k    car    8

>>> d[3]

       0      1      2  Age
0  j3uli  nic4k  jul5i    4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...