Найти индекс первой строки, ближайший к значению в пандах DataFrame - PullRequest
0 голосов
/ 13 июня 2018

Итак, у меня есть фрейм данных, содержащий несколько столбцов.Для каждого столбца я хотел бы получить индекс первой строки, который почти равен указанному пользователем числу (например, в пределах 0,05 от желаемого числа).Кадр данных выглядит примерно так:

ix   col1   col2   col3
0    nan    0.2    1.04
1    0.98   nan    1.5
2    1.7    1.03   1.91
3    1.02   1.42   0.97

Скажем, я хочу, чтобы первая строка была почти равна 1,0, я ожидаю, что результат будет:

  • index 1 для col1(не индекс 3, даже если они математически одинаково близки к 1,0)
  • индекс 2 для col2
  • индекс 0 для col3 (не индекс 3, даже если 0,97 ближе к 1, чем 1,04)

Я пробовал подход, который использует argsort ():

df.iloc[(df.col1-1.0).abs().argsort()[:1]]

Это, согласно другим темам, даст мне индекс строки в col1 со значениемближе всего к 1.0.Однако он возвращает только кадр данных, полный nans.Я также предположил бы, что этот метод не дает первое значение, близкое к 1, с которым он сталкивается в столбце, а скорее значение, которое ближе всего к 1.

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Предположим, у вас есть некоторое значение допуска tol для почти совпадающего порога.Вы можете создать маску данных для значений ниже порогового значения и использовать first_valid_index () в каждом столбце для получения индекса первого совпадения.

tol = 0.05
mask = df[(df - 1).abs() < tol]
for col in df:
    print(col, mask[col].first_valid_index())
0 голосов
/ 13 июня 2018

Используйте DataFrame.sub для разницы, конвертируйте в абсолютные значения на abs, сравните на lt (<) и последний раз получитеиндекс первого значения на DataFrame.idxmax:

a = df.sub(1).abs().lt(0.05).idxmax()
print (a)
col1    1
col2    2
col3    0
dtype: int64

Но для более общего решения, работает, если неудачная логическая маска (нет значения в допуске), добавляется новый столбец, заполненный True s с именем NaN:

print (df)
    col1  col2  col3
ix                  
0    NaN  0.20  1.07
1   0.98   NaN  1.50
2   1.70  1.03  1.91
3   1.02  1.42  0.87

s = pd.Series([True] * len(df.columns), index=df.columns, name=np.nan)
a = df.sub(1).abs().lt(0.05).append(s).idxmax()
print (a)
col1    1.0
col2    2.0
col3    NaN
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...