如何基于两个不同列中的值来转换数据帧?

2024-06-16 08:34:00 发布

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

我有一个数据帧,下面分享了一个示例-

Index   Name    Value
3        A       xyz
4        B       asd
5        C       cvz
6        D       red
7        E       fsd
3        A       gfd
4        B       gsa
5        C       hgd
6        D       ewr
7        E       dgs

预期产出

A      B      C      D      E
xyz   asd    cvz    red    fsd
gfd   gsa    hgd    ewr    dgs

这个预期输出背后的原因是我们重复了Index列中的值,并且列名出现在Name中。我已尝试使用groupbytranspose,但无法获得预期的输出

编辑1

也可能有以下情况

Index   Name    Value
3        A       xyz
4        B       asd
6        D       red
7        E       fsd
3        A       gfd
4        B       gsa
5        C       hgd
6        D       ewr
7        E       dgs
3        A       dfd
4        B       dsa
5        C       dgd
6        D       dwr

预期产出

A      B      C      D      E
xyz   asd           red    fsd
gfd   gsa    hgd    ewr    dgs
dfd   dsa    dgd    dwr    

编辑2

解释:列Index中有一个重复的值列表,每当出现负变化/无变化时(下一行的索引值小于或等于上一行),表示对应的值是下一行的值。 在提供的第二个示例中,列A、B、D和E的值在索引的第一次重复出现时出现,而这些重复出现的最后一次出现时没有E,因此这些行应与预期输出的行相同

谢谢


Tags: name编辑示例indexvalueredxyzasd
3条回答

试试这个:

df['Index'] = df.groupby(['Index', 'Name'])['Index'].cumcount()
df.pivot(index='Index', columns='Name', values='Value').reset_index(drop=True)
#output
Name    A   B   C   D   E
0       xyz asd cvz red fsd
1       gfd gsa hgd ewr dgs

多亏了@Terry的解决方案。我只添加了fillna方法

from pandas import DataFrame

if __name__ == '__main__':
    data = {'Index': [3, 4,
                      5, 6,
                      7, 3,
                      4, 5,
                      6, 7,
                      3, 4,
                      5, 6],
            'Name': ['A', 'B',
                     'C', 'D',
                     'E', 'A',
                     'B', 'C',
                     'D', 'E',
                     'A', 'B',
                     'C', 'D'],
            'Value': ['xyz', 'asd',
                      'cvz', 'red',
                      'fsd', 'gfd',
                      'gsa', 'hgd',
                      'ewr', 'dgs',
                      'dfd', 'dsa',
                      'dgd', 'dwr']}

    df = DataFrame(data, columns=['Index',
                                  'Name',
                                  'Value'])

    df['Index'] = df.groupby(['Index', 'Name'])['Index'].cumcount()

    print(df.pivot(index='Index',
                   columns='Name',
                   values='Value').reset_index(drop=True).fillna(''))

输出:

Name    A    B    C    D    E
0     xyz  asd  cvz  red  fsd
1     gfd  gsa  hgd  ewr  dgs
2     dfd  dsa  dgd  dwr     
In [52]: df
Out[52]:
   Index Name Value
0      3    A   xyz
1      4    B   asd
2      5    C   cvz
3      6    D   red
4      7    E   fsd
5      3    A   gfd
6      4    B   gsa
7      5    C   hgd
8      6    D   ewr
9      7    E   dgs

In [53]: df.groupby("Name").agg({'Value':list}).T.apply(pd.Series.explode).reset_index(drop=True)
Out[53]:
Name    A    B    C    D    E
0     xyz  asd  cvz  red  fsd
1     gfd  gsa  hgd  ewr  dgs

相关问题 更多 >