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

2024-09-28 03:15:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的数据框,但只分享下面的示例。它是一个带有示例标题列名的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。我只想要第一个。 好心帮忙


Tags: columnscsv数据sample示例dfcolpd
1条回答
网友
1楼 · 发布于 2024-09-28 03:15:33

似乎您可以在此处使用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

相关问题 更多 >

    热门问题