将多行按列值连接成一行,并根据连接行的数量将结果数据帧拆分为多个数据帧

2024-10-01 02:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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

我想将共享同一年龄列的所有行放在一行中,然后根据为每个共享行生成的列数来分隔数据帧。结果是这样的

第一个结果dataframe,它有两行,因为有两行共享相同的列数

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

Tags: 数据namepandasagecartomj3ulinic8k
2条回答

使用^{}

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

这里有一个方法

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

相关问题 更多 >