猿问

使用 pandas 获取该行中第一个非零值的列名

我有一个巨大的数据框,但只分享下面的示例。它是一个带有示例标题列名称的 CSV,如下所示。


sample.csv

cnum,sup1,sup2,sup3,sup4

285414459,1,0,1,1

445633709,1,0,0,0

556714736,0,0,1,0

1089852074,0,1,0,1

cnum 可以在所有 sup* 列中设置 0 或 1。我想选择并打印该 cnum 遇到第一个 1 的列名。之后的所有其他 1 都应忽略,并且不应在输出中打印任何列名。


expected output:

cnum,supcol

285414459,sup1

445633709,sup1

556714736,sup3

1089852074,sup2

目前我试过这段代码:


import pandas as pd

df=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 的所有列名。我只想要第一个。请帮忙


波斯汪
浏览 207回答 1
1回答

叮当猫咪

好像你可以idxmax在这里使用:df.set_index('cnum').idxmax(axis=1).reset_index(drop=True)0    sup11    sup12    sup33    sup2dtype: objectdf['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 output0   285414459     1     0     1     1   sup11   445633709     1     0     0     0   sup12   556714736     0     0     1     0   sup33  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,sup41              sup12              sup33         sup2,sup4dtype: object要么,(d.dot(d.columns + ',')  .str.rstrip(',')  .str.split(',', 1).str[0]   .reset_index(drop=True))0    sup11    sup12    sup33    sup2dtype: object
随时随地看视频慕课网APP

相关分类

Python
我要回答