解开数据框架

2024-10-01 19:25:29 发布

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

我需要把一个df转换成antoher,作为原始的(df1)像这样:

           value
    A--A     4     
    A--B     2     
    A--C     1    
    B--B     2    
    C--C     3    
    D--B     2    
    E--E     6    

然后我得到另一个df2,填充了0:

        A    B    C    D    E
    A   0    0    0    0    0
    B   0    0    0    0    0
    C   0    0    0    0    0
    D   0    0    0    0    0
    E   0    0    0    0    0
    F   0    0    0    0    0
    G   0    0    0    0    0

我需要将其转换为最终的df3,从df1中的索引对中获取值,用“--”分隔,并按如下方式填充:

        A    B    C    D    E
    A   4    2    1    0    0
    B   2    2    0    2    0
    C   1    0    3    0    0
    D   0    2    0    0    0
    E   0    0    0    0    6
    F   0    0    0    0    0
    G   0    0    0    0    0

pd2中可能存在pd1中不存在的对。在这种情况下,它仍然是0。有什么建议


Tags: dfvalue方式情况建议df1df2df3
1条回答
网友
1楼 · 发布于 2024-10-01 19:25:29

您可以从df本身创建它。首先,使用str.splitdf.index设置为MultiIndex,然后unstackreindex

df.index = pd.MultiIndex.from_arrays(zip(*df.index.str.split(' ')))
(df['value'].unstack()
            .reindex(index=df2.index, columns=df2.columns)
            .fillna(0, downcast='infer'))

   A  B  C  D  E
A  4  2  1  0  0
B  0  2  0  0  0
C  0  0  3  0  0
D  0  2  0  0  0
E  0  0  0  0  6
F  0  0  0  0  0
G  0  0  0  0  0

如果您知道要使用哪些行和列,那么甚至不需要df2

(df['value'].unstack()
            .reindex(index=list('ABCDEFG'), columns=list('ABCDE'))
            .fillna(0, downcast='infer'))

   A  B  C  D  E
A  4  2  1  0  0
B  0  2  0  0  0
C  0  0  3  0  0
D  0  2  0  0  0
E  0  0  0  0  6
F  0  0  0  0  0
G  0  0  0  0  0

根据OP的评论,要保持对称性,请使用pivot表以保留nan,然后使用转置fillna

v = (df['value'].unstack()
                .reindex(index=df2.index, columns=df2.columns))
v.fillna(v.T.reindex_like(v)).fillna(0, downcast='infer')

   A  B  C  D  E
A  4  2  1  0  0
B  2  2  0  2  0
C  1  0  3  0  0
D  0  2  0  0  0
E  0  0  0  0  6
F  0  0  0  0  0
G  0  0  0  0  0

相关问题 更多 >

    热门问题