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

将多行按列值合并为一行,并根据连接行数拆分为多个数据帧,用于多列

将多行按列值合并为一行,并根据连接行数拆分为多个数据帧,用于多列

倚天杖 2022-06-28 10:58:35
它显示了在要组合一列和额外一列的情况下如何组合行。我现在正在为有很多列的情况寻找解决方案,并且我仍然想基于一列组合行。我希望如何处理是:首先列出一种类型的所有列,然后以与第一次相同的顺序列出另一种类型的列。这是一个最小的例子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    Age0   tom ca  21   ni2ck   ma  22   j3uli   ny  43   nic4k   ma  44   jul5i   ny  45   nic6k   ma  76   ju7li   ny  77   nic8k   ma  78   ju9li   ny  79   nic1k   ma  810  car ny  8这将是期望的结果    Name    Name    Location    Location    Age0   tom ni2ck   ca  ma  21   nic1k   car ma  ny  8Name    Name    Name    Location    Location    Location    Age0   j3uli   nic4k   jul5i   ny  ma  ny  4Name    Name    Name    Name    Location    Location    Location    Location    Age0   nic6k   ju7li   nic8k   ju9li   ma  ny  ma  ny  7重要的是,正确的位置与相应名称的顺序相同。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

从@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


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号