如何找到第一个匹配的列位置

时间:2019-04-19 20:23:07

标签: python-3.x pandas numpy dataframe

我有一个具有500K行和200列的数据框。我需要找到每行的第一个零的列索引。如果我连续找不到零,我应该会看到999。

谢谢您的帮助。

这是我的示例:

a = {'A':[1,2,5,7,0,9],
     'B':[6,5,0,0,7,2],
     'C':[0,8,np.nan,10,0,6],
     'D':[np.nan, 9,5,2,6,7],
     'E':[1,4,6,3,3,6]}
aidx = ['id_1','id_2','id_3',
        'id_4','id_5','id_6']
df = pd.DataFrame(a, index=aidx)
def get_col(df,num):
    df_num = df==num
    df_num=df_num[df_num.any(axis=1)].idxmax(axis=1)
    return(df_num)
df_new = pd.DataFrame(get_col(df,0))
df_need = pd.DataFrame([2,999,1,1,0,999], index=aidx)

2 个答案:

答案 0 :(得分:2)

就是这样

s=(df.values==0)
np.where(np.any(s,1),s.argmax(1),999)
Out[77]: array([  2, 999,   1,   1,   0, 999], dtype=int64)

答案 1 :(得分:0)

根据数据框列名称创建映射字典,并使用numpy构造数据框,其中

d = dict(zip(df.columns, np.arange(len(df.columns))))

df = pd.DataFrame(np.where(df.eq(0).any(1),df.eq(0).idxmax(1), 999), index=df.index)
df[0] = df[0].map(d).fillna(999).astype(int)

        0
id_1    2
id_2    999
id_3    1
id_4    1
id_5    0
id_6    999

或者使用Numpy,

from numpy import copy

a = copy(np.where(df.eq(0).any(1),df.eq(0).idxmax(1), 999))
for k, v in d.items():
    a[a==k] = v
pd.DataFrame(a, index = df.index)