亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 pandas 獲取該行中第一個非零值的列名

使用 pandas 獲取該行中第一個非零值的列名

波斯汪 2023-01-04 16:46:53
我有一個巨大的數據框,但只分享下面的示例。它是一個帶有示例標題列名稱的 CSV,如下所示。sample.csvcnum,sup1,sup2,sup3,sup4285414459,1,0,1,1445633709,1,0,0,0556714736,0,0,1,01089852074,0,1,0,1cnum 可以在所有 sup* 列中設置 0 或 1。我想選擇并打印該 cnum 遇到第一個 1 的列名。之后的所有其他 1 都應忽略,并且不應在輸出中打印任何列名。expected output:cnum,supcol285414459,sup1445633709,sup1556714736,sup31089852074,sup2目前我試過這段代碼:import pandas as pddf=pd.read_csv('sample.csv')df_union=pd.DataFrame(columns=['cnum','supcol'])for col in df.columns:     df1=df.filter(['cnum']).loc[df[col] == 1]    df1['supcol']=col    df_union=df_union.append(df1)print(df_union)但是,它會打印列名設置為 1 的所有列名。我只想要第一個。請幫忙
查看完整描述

1 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

好像你可以idxmax在這里使用:


df.set_index('cnum').idxmax(axis=1).reset_index(drop=True)


0    sup1

1    sup1

2    sup3

3    sup2

dtype: object


df['output'] = df.set_index('cnum').idxmax(axis=1).reset_index(drop=True) 

# Slightly faster,

# df['output'] = df.set_index('cnum').idxmax(axis=1).to_numpy() 


df

         cnum  sup1  sup2  sup3  sup4 output

0   285414459     1     0     1     1   sup1

1   445633709     1     0     0     0   sup1

2   556714736     0     0     1     0   sup3

3  1089852074     0     1     0     1   sup2

另一個選項dot(將為您提供所有非零列):


d = df.set_index('cnum') 

d.dot(d.columns + ',').str.rstrip(',').reset_index(drop=True)


0    sup1,sup3,sup4

1              sup1

2              sup3

3         sup2,sup4

dtype: object

要么,


(d.dot(d.columns + ',')

  .str.rstrip(',')

  .str.split(',', 1).str[0] 

  .reset_index(drop=True))


0    sup1

1    sup1

2    sup3

3    sup2

dtype: object


查看完整回答
反對 回復 2023-01-04
  • 1 回答
  • 0 關注
  • 255 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號