我有一个具有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)
答案 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)