pandas 以特定方式在Python中扫描表

2wnc66cl  于 2022-11-20  发布在  Python
关注(0)|答案(1)|浏览(100)

我有表如:

Groups SP1 SP2 SP3 SP4_1 SP4_2 SP5_1 SP5_2
G1     3   4   NA  2     4     2     1
G2     NA  1   NA  3     NA    NA    NA
G3     1   2   NA  NA    NA    8     NA
G4     4   6   NA  NA    NA    NA    NA
G5     8   9   NA  NA    NA    NA    2

我想把这张table整理成:

G1               G2       G3       G4     G5 
SP1    SP1-3            NA       SP1-1    SP1-4  SP1-8
SP2    SP2-4            SP2-1    SP2-2    SP2-6  SP2-9
SP3    NA               NA       NA       NA     NA
SP4    SP4_1-2;SP4_2-4  SP4_1-3  NA       NA     NA
SP5    SP5_1-2;SP5_2-1  NA       SP5_1-8  NA     SP5_2-2

让我解释一下:
让我们以G1为例来解释,首先创建一个新列G1,并将所有SPn作为行添加:

G1  
SP1  
SP2    
SP3    
SP4    
SP5

然后,在G1中,SP1有一个值,即3,然后添加一行SP1-3

G1  
SP1  SP1-3
SP2    
SP3    
SP4    
SP5

SP2有一个值,即4,然后添加一行SP1-4

G1  
SP1  SP1-3
SP2  SP1-4
SP3    
SP4    
SP5

我没有SP3的值

G1  
SP1  SP1-3
SP2  SP1-4
SP3  NA
SP4    
SP5

我有两个SP 4的值,在SP4_1中是2,在SP4_2中是4,然后我用分号“将它们合并;“,并添加一行SP4_1-2;SP4_2-4

G1  
SP1  SP1-3
SP2  SP1-4
SP3  NA
SP4  SP4_1-2;SP4_2-4
SP5

最后我有两个SP 5的值,在SP5_1中是2,在SP5_2中是1,然后我用分号将它们合并“;“,并添加一行SP5_1-2;SP5_2-1

G1  
SP1  SP1-3
SP2  SP1-4
SP3  NA
SP4  SP4_1-2;SP4_2-4
SP5  SP5_1-2;SP5_2-1

其他组依此类推。
有人知道如何使用python吗?

jdzmm42g

jdzmm42g1#

这是我的尝试,看起来不太好,但似乎工作:

t = df.melt('Groups')
t['val'] = t['variable'].str.cat(t['value'].dropna().astype(str),sep='-')
t['col'] = t['variable'].str[:3]

def f(x):
    return x.dropna().str.cat(sep=';') or pd.NA

res = t.pivot_table('val','col','Groups',f)

print(res)
'''
Groups                   G1         G2         G3       G4         G5
col                                                                  
SP1                 SP1-3.0        NaN    SP1-1.0  SP1-4.0    SP1-8.0
SP2                 SP2-4.0    SP2-1.0    SP2-2.0  SP2-6.0    SP2-9.0
SP4     SP4_1-2.0;SP4_2-4.0  SP4_1-3.0        NaN      NaN        NaN
SP5     SP5_1-2.0;SP5_2-1.0        NaN  SP5_1-8.0      NaN  SP5_2-2.0

相关问题