熊猫移动行值以匹配列名

时间:2019-09-12 14:44:42

标签: python pandas pandas-groupby

我有一个示例数据集,其中包含一组列名。在移动数据时,我每行都在每行中打印字母,如下所示。

我正在尝试移动每一行的值以匹配任一相应的列。我曾尝试这样做pd.shift(),但没有取得太大的成功。我试图得到下面看到的。有什么想法吗?

import pandas as pd
df = pd.DataFrame({'A': list('AAAAA'),
                   'B': list('CBBDE'),
                   'C': list('DDCEG'),
                   'D': list('EEDF '),
                   'E': list('FFE  '),
                   'F': list('GGF  '),
                   'G': list('  G  ')})

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

之后:

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

3 个答案:

答案 0 :(得分:3)

这是更多列表pivot问题

s=df.mask(df=='').stack().reset_index()
s.pivot(index='level_0',columns=0,values=0)
Out[34]: 
0        A    B  C    D
level_0                
0        A    B  C    D
1        A  NaN  C  NaN
2        A  NaN  C    D

答案 1 :(得分:3)

这是广播的比较方法。这将非常快,但是确实具有更高的内存复杂性。


a = df.to_numpy()
b = df.columns.to_numpy()

pd.DataFrame(np.equal.outer(a, b).any(1) * b, columns=b)

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

答案 2 :(得分:1)

这里是Tstackmerge的一种方式:

pivot

输出:

new_df = df.stack().reset_index()
(new_df.merge(new_df, left_on=['level_0', 'level_1'], 
              right_on=['level_0',0], 
              how='left')
       .pivot('level_0', 'level_1', '0_y')
)