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

我有一个熊猫数据框,其中几行共享特定的列值。对于这些行,我想将这些行连接成一行。并且单个具有共享列值的行数存在变化,我想将这些数据帧拆分为它们自己单独的数据帧,因此对于特定数量的共享行是一个唯一的数据帧。


这是我想要的一个例子。


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

我想将共享相同 Age 列的所有行放入一行,然后根据为每个共享行生成的列数分离数据框。所以结果看起来像这样


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


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


慕田峪9158850
浏览 114回答 2
2回答

温温酱

这是一种方法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      3Age                            7    nic6k  ju7li  nic8k  ju9lil[1]New      0      1      2Age                     4    j3uli  nic4k  jul5il[2]New      0      1Age              2      tom  ni2ck8    nic1k    car

红颜莎娜

使用collections.defaultdictfrom collections import defaultdictd = 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  Age0    tom  ni2ck    21  nic1k    car    8>>> d[3]       0      1      2  Age0  j3uli  nic4k  jul5i    4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python