Как найти позицию столбца для первого соответствия - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть фрейм данных, который имеет 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 ]

2 голосов
/ 19 апреля 2019

Так же, как это

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 голос
/ 19 апреля 2019

Создайте словарь сопоставления из имен столбцов фрейма данных и создайте фрейм данных, используя 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...