通过对同时具有数字和字符串变量的数据帧进行分组进行转置

2024-10-02 00:34:59 发布

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

我有一个数据帧,我想将其转换为以下内容:

import pandas as pd
df = pd.DataFrame({'ID':[111,111,111,222,222,333],
                   'class':['merc','humvee','bmw','vw','bmw','merc'],
                   'imp':[1,2,3,1,2,1]})
print(df)
    ID   class  imp
0  111    merc    1
1  111  humvee    2
2  111     bmw    3
3  222      vw    1
4  222     bmw    2
5  333    merc    1

所需输出:

    ID       0        1       2
0  111    merc   humvee     bmw
1  111       1        2       3
2  222      vw      bmw
3  222       1        2
4  333    merc      
5  333       1

我希望transpose整个数据帧,但是grouped by在本例中是一个特定的列ID,并维护行order

我的尝试:我尝试使用.set_index(.unstack(),但没有成功


Tags: 数据importiddataframepandasdfasclass
2条回答

使用^{}作为计数器,然后通过^{}^{}重塑形状:

df1 = (df.set_index(['ID',df.groupby('ID').cumcount()])
         .stack()
         .unstack(1, fill_value='')
         .reset_index(level=1, drop=True)
         .reset_index())
print (df1)
    ID     0       1    2
0  111  merc  humvee  bmw
1  111     1       2    3
2  222    vw     bmw     
3  222     1       2     
4  333  merc             
5  333     1             

另一种方法是使用groupbyconcat-虽然这不是完全动态的,但如果您只想使用两列,即classimp,它就可以正常工作

s = df.set_index([df['ID'],df.groupby('ID').cumcount()]).unstack(1)

df1 = pd.concat([s['class'],s['imp']],axis=0).sort_index().fillna('')

print(df1)

idx     0       1    2
ID                    
111  merc  humvee  bmw
111     1       2    3
222    vw     bmw     
222     1       2     
333  merc             
333     1             

相关问题 更多 >

    热门问题