如何将多列转置到多行中,但保留主键,就像使用Pandas一样

2024-09-27 23:19:13 发布

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

我有一个数据帧,可以从下面给出的代码生成

df = pd.DataFrame({'person_id' :[1,2,3],'date1': ['12/31/2007','11/25/2009','10/06/2005'],'date1derived':[0,0,0],'val1':[2,4,6],'date2': ['12/31/2017','11/25/2019','10/06/2015'],'date2derived':[0,0,0],'val2':[1,3,5],'date3':['12/31/2027','11/25/2029','10/06/2025'],'date3derived':[0,0,0],'val3':[7,9,11]})

数据帧如下所示

enter image description here

我想保留每个人的行作为单独的行,而不是如屏幕截图所示的列在上面另外,我希望删除date1derived、date2derived列。你知道吗

我确实尝试了以下方法,但它们没有提供预期的输出

1) df.set_index(['person_id']).stack()/unstack
2) df.set_index(['person_id','date1','date2','date3']).stack()/unstack()
3) df.set_index('person_id').unstack()/stack

我怎样才能得到这样的输出?我有600多列,所以我不认为手动编写列名对我有帮助。你知道吗

enter image description here


Tags: 数据iddfindexstack代码生成personpd
2条回答

这是一个^{}问题:

pd.wide_to_long(df, stubnames=['date', 'val'], i='person_id', j='grp').sort_index(level=0)

                     date  val
person_id grp                 
1         1    12/31/2007    2
          2    12/31/2017    1
          3    12/31/2027    7
2         1    11/25/2009    4
          2    11/25/2019    3
          3    11/25/2029    9
3         1    10/06/2005    6
          2    10/06/2015    5
          3    10/06/2025   11

要匹配预期输出:

df = pd.wide_to_long(df, stubnames=['date', 'val'], i='person_id', j='grp').sort_index(level=0)
df = df.reset_index(level=1, drop=True).reset_index()

   person_id        date  val
0          1  12/31/2007    2
1          1  12/31/2017    1
2          1  12/31/2027    7
3          2  11/25/2009    4
4          2  11/25/2019    3
5          2  11/25/2029    9
6          3  10/06/2005    6
7          3  10/06/2015    5
8          3  10/06/2025   11

您可以不使用wide\u to\u long()而只使用append()

df2 = pd.DataFrame()
for i in range(1, 4):
    new_df = df[['person_id', f'date{i}', f'val{i}']]
    new_df.columns = ['person_id', 'date', 'val']
    df2 = df2.append(new_df)
df2.sort_values('person_id').reset_index(drop=True)

输出:

   person_id        date  val
0          1  12/31/2007    2
1          1  12/31/2017    1
2          1  12/31/2027    7
3          2  11/25/2009    4
4          2  11/25/2019    3
5          2  11/25/2029    9
6          3  10/06/2005    6
7          3  10/06/2015    5
8          3  10/06/2025   11

相关问题 更多 >

    热门问题