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

Это продолжение этого вопроса SO: Объединить несколько строк в одну строку по значению столбца и разбить результирующий кадр данных на несколько кадров данных на основе количества связанных строк

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

Сейчас я ищу решение для случая, когда есть много столбцов, и я все еще хочу объединить строки, основанные на одном столбце.

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

Вот минимальный пример

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

результаты:

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

Здесь будут желаемые результаты

    Name    Name    Location    Location    Age
0   tom ni2ck   ca  ma  2
1   nic1k   car ma  ny  8


Name    Name    Name    Location    Location    Location    Age
0   j3uli   nic4k   jul5i   ny  ma  ny  4


Name    Name    Name    Name    Location    Location    Location    Location    Age
0   nic6k   ju7li   nic8k   ju9li   ma  ny  ma  ny  7

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

1 Ответ

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

Разработка из решения @Wen. Вместо pivot используйте pivot_table

df['New']=df.groupby('Age').cumcount()
s= df.pivot_table(index='Age',columns='New',
                  values=['Name', 'Location'], 
                  aggfunc='first').reindex(['Name', 'Location'], axis=1, level=0)
s.columns = s.columns.map('{0[0]}{0[1]}'.format)

l=[y.dropna(1).reset_index() for _ , y in s.groupby(s.isnull().sum(1))]

In [499]: l[0]
Out[499]:
   Age  Name0  Name1  Name2  Name3 Location0 Location1 Location2 Location3
0    7  nic6k  ju7li  nic8k  ju9li        ma        ny        ma        ny

In [500]: l[1]
Out[500]:
   Age  Name0  Name1  Name2 Location0 Location1 Location2
0    4  j3uli  nic4k  jul5i        ny        ma        ny

In [501]: l[2]
Out[501]:
   Age  Name0  Name1 Location0 Location1
0    2    tom  ni2ck        ca        ma
1    8  nic1k    car        ma        ny

Если вы хотите сохранить многоиндексные столбцы, пропустите команду map для столбцов

df['New']=df.groupby('Age').cumcount()
s= df.pivot_table(index='Age',columns='New',
                  values=['Name', 'Location'], 
                  aggfunc='first').reindex(['Name', 'Location'], axis=1, level=0)

l=[y.dropna(1).reset_index() for _ , y in s.groupby(s.isnull().sum(1))]

In [544]: l[0]
Out[544]:
    Age   Name                      Location
New          0      1      2      3        0   1   2   3
0     7  nic6k  ju7li  nic8k  ju9li       ma  ny  ma  ny

In [545]: l[1]
Out[545]:
    Age   Name               Location
New          0      1      2        0   1   2
0     4  j3uli  nic4k  jul5i       ny  ma  ny

In [546]: l[2]
Out[546]:
    Age   Name        Location
New          0      1        0   1
0     2    tom  ni2ck       ca  ma
1     8  nic1k    car       ma  ny
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...