пользовательское вменение кадра данных панды с ближайшими значениями - PullRequest
0 голосов
/ 20 октября 2019

У меня есть этот фрейм данных

df = pd.DataFrame({"A": [10, 10, 10, 22, 30, 30, 30, 30, 30], "B": ["a", "a", "b", "b", "b", "a", "b", "b", "b"], "C": [2, 5, 10, np.nan, 15, 20, 35, 35, 35]})

, поэтому мой фрейм данных выглядит следующим образом

Index  A   B   C
0      10  a   2
1      10  a   5
2      10  b  10
3      22  b nan
4      30  b  15
5      30  a  20
6      30  b  35
7      30  b  35
8      30  b  35

в 3-й строке, я хотел бы вписать столбец C на основе значения встолбец C, удовлетворяющий этим условиям.

  1. ближайшее значение в A (включая себя). для 3-й строки самое близкое значение в A для 22 равно 30. (Если в других строках есть 22, то самое близкое значение - 22)
  2. то же значение в B. для 3-й строки, значение Bb.
  3. значение большинства в C. для 3-й строки, мы видим, что строки 4, 5, 6, 7, 8 удовлетворяют предыдущим 2 условиям, но значение большинства в C равно 35.

Таким образом, ожидаемый результат для 3-й строки в столбце C равен 35. Я могу написать коды методом грубой силы, но мне интересно, можем ли мы сделать более элегантные способы или нет.

1 Ответ

0 голосов
/ 20 октября 2019

Определите следующую функцию:

def findVal(row):
    iMin = (df1[df1.B == row.B].A - row.A).abs().idxmin()
    aClo = df1.loc[iMin].A
    return df1[df1.A.eq(aClo) & df1.B.eq(row.B)].C.mode().iloc[0]

Описание:

  • строка (параметр) - строка, для которой C значение должно быть найдено.
  • df1 - Здесь ищите данные.
  • iMin - Ряд с ближайшим A находится в этом индексе.
  • aClo - Ближайшее значение A .
  • Возвращаемое значение:
    • Найти строкис ближайшими A и такими же B .
    • Из них возвращают наиболее часто встречающееся значение C .

Затем генерирует df1 - строки из df с непустыми значениями C .

df1 = df[df.C.notna()]

И, чтобы заполнить пропущенные значения, запустите:

df.C.update(df[df.C.isna()].apply(findVal, axis=1))

Описание:

  • df [df.C.isna ()] - Найти строки с пустымизначения C .
  • .apply (...) - Применить findVal к каждой такой строке.
  • результатом является серия с:
    • индексами строк с пропущенными значениями,
    • значениями, возвращаемыми findVal .
  • df.C.update (...) - Приведенный выше столбец Series обновляет C по указанным индексам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...