簡體   English   中英

將非零列名轉換為Python中的行

[英]Convert non-zero column names to rows in Python

當每個ID將非零列名稱寫為行時,需要將稀疏數據幀轉換為形狀。

我嘗試使用iterrows循環 - 但它很慢,我無法使用它。 也許有人有更好的想法?

例如,Initial df:

df=pd.DataFrame({'Id':['id1','id2','id3'], 'a':[0,1,1] ,'b':[1,0,1], 'c':[1,1,0]})

Id  a b c
id1 0 1 1 
id2 1 0 1 
id3 1 1 0 

預期:

Id   columns
id1    b 
id1    c 
id2    a 
id2    c 
id3    a 
id3    b

使用pandas .25.0 ,這是一種使用.dotexplode

m=df.set_index('Id')
m.dot(m.columns+',').str[:-1].str.split(',').explode().reset_index(name='Columns')

   Id Columns
0   0       b
1   0       c
2   1       a
3   1       c
4   2       a
5   2       b

看起來你想要的只是疊加的索引,而不是值。 我可以建議set_indexstack嗎?

df2 = df.set_index('Id')
(df2[df2.astype(bool)]
     .stack()
     .index
     .to_frame()
     .reset_index(drop=True)
     .set_axis(['Id', 'columns'], axis=1, inplace=False))                                                                               

   Id columns
0   0       b
1   0       c
2   1       a
3   1       c
4   2       a
5   2       b

讓我們使用melt和過濾器與loc

df.melt('Id').loc[lambda x: x['value'] != 0].sort_values('Id')

輸出:

    Id variable  value
3  id1        b      1
6  id1        c      1
1  id2        a      1
7  id2        c      1
2  id3        a      1
5  id3        b      1

根據@Oleskii評論更新:

df.reset_index().melt(['index','Id']).loc[lambda x : x['value'] != 0].sort_values('index')

輸出:

   index   Id variable  value
3      0  id1        b      1
6      0  id1        c      1
1      1  id2        a      1
7      1  id2        c      1
2      2  id3        a      1
5      2  id3        b      1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM