为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪9158850 2022-06-28 10:33:15
我有一个熊猫数据框,其中几行共享特定的列值。对于这些行,我想将这些行连接成一行。并且单个具有共享列值的行数存在变化,我想将这些数据帧拆分为它们自己单独的数据帧,因此对于特定数量的共享行是一个唯一的数据帧。这是我想要的一个例子。import pandas as pddata = [['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    Age0   tom 21   ni2ck   22   j3uli   43   nic4k   44   jul5i   45   nic6k   76   ju7li   77   nic8k   78   ju9li   79   nic1k   810  car 8我想将共享相同 Age 列的所有行放入一行,然后根据为每个共享行生成的列数分离数据框。所以结果看起来像这样第一个结果数据帧,它有两行,因为有两行共享相同的列数。Name    Name    Age0   tom ni2ck   21   nic1k   car 8第二个结果数据框Name    Name    Name    Age0   j3uli   nic4k   jul5i   4第三个结果数据框    Name    Name    Name    Name    Age0   nic6k   ju7li   nic8k   ju9li   7
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超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


查看完整回答
反对 回复 2022-06-28
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

使用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


查看完整回答
反对 回复 2022-06-28
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信