Найти первое ненулевое значение в каждом столбце панд DataFrame - PullRequest
0 голосов
/ 29 мая 2018

Что такое пандорический способ получить значение и индекс первого ненулевого элемента в каждом столбце DataFrame (сверху вниз)?

import pandas as pd

df = pd.DataFrame([[0, 0, 0],
                   [0, 10, 0],
                   [4, 0, 0],
                   [1, 2, 3]],
                  columns=['first', 'second', 'third'])

print(df.head())

#    first  second  third
# 0      0       0      0
# 1      0      10      0
# 2      4       0      0
# 3      1       2      3

Чего я хотел бы достичь:

#        value  pos
# first      4    2
# second    10    1
# third      1    3

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Вот длинный путь, который должен быть быстрее, если ваши ненулевые значения имеют тенденцию появляться вблизи начала больших массивов:

import pandas as pd

df = pd.DataFrame([[0, 0, 0],[0, 10, 0],[4, 0, 0],[1, 2, 3]],
                  columns=['first', 'second', 'third'])

res = [next(((j, i) for i, j in enumerate(df[col]) if j != 0), (0, 0)) for col in df]

df_res = pd.DataFrame(res, columns=['value', 'position'], index=df.columns)

print(df_res)

        value  position
first       4         2
second     10         1
third       3         3
0 голосов
/ 29 мая 2018

Я буду использовать stack, индекс для номера строки и столбца

df[df.eq(df.max(1),0)&df.ne(0)].stack()
Out[252]: 
1  second    10.0
2  first      4.0
3  third      3.0
dtype: float64
0 голосов
/ 29 мая 2018

Вы ищете idxmax, который дает вам первую позицию максимума.Однако вам нужно найти максимум «не равно нулю»

df.ne(0).idxmax()

first     2
second    1
third     3
dtype: int64

Мы можем связать это с lookup и assign

df.ne(0).idxmax().to_frame('pos').assign(val=lambda d: df.lookup(d.pos, d.index))

        pos  val
first     2    4
second    1   10
third     3    3

Тот же ответ упакован несколько иначе.

m = df.ne(0).idxmax()
pd.DataFrame(dict(pos=m, val=df.lookup(m, m.index)))

        pos  val
first     2    4
second    1   10
third     3    3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...