Как заменить значения данных в numpy .nan, используя df.quantile (axis = 1) - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть фрейм данных с построчным восходящим рангом других значений (через df.rank (ascending = True, axis = 1)), и я пытаюсь замаскировать значения, которые находятся между 30% и 70% квантилями ,

df = {"A": [numpy.nan, 1, 2, 3, 2], "B": [2, 2, 1, 2, 1], "C": [1, 3, 3, 1, 3]}
df = pandas.DataFrame(df)
df["top_quantile"] = df.quantile(0.7, axis = 1)
df["bottom_quantile"] = df[["A", "B", "C"]].quantile(0.3, axis = 1)
df
     A  B  C  top_quantile  bottom_quantile
0  NaN  2  1           1.7              1.3
1  1.0  2  3           2.4              1.6
2  2.0  1  3           2.4              1.6
3  3.0  2  1           2.4              1.6
4  2.0  1  3           2.4              1.6

Это было бы тривиально, если бы квантили были статичны c, но, как в приведенном выше примере с кадром данных, наблюдения добавляются со временем, так что это немного сложнее, и у меня есть наблюдения в диапазоне от 8 действительных столбцов более 1000, поэтому значения квантилей всегда меняются. Есть ли простой метод сделать это в python, который предпочтительно не для l oop? Моя цель такова, как показано ниже (обратите внимание, что df.iloc [0, 0] уже был nan):

     A    B  C  top_quantile  bottom_quantile
0  NaN  2.0  1           1.7              1.3
1  1.0  NaN  3           2.4              1.6
2  NaN  1.0  3           2.4              1.6
3  3.0  NaN  1           2.4              1.6
4  NaN  1.0  3           2.4              1.6

В настоящее время я пробовал:

df[(df > df["bottom_quantile"]) & (df < df["top_quantile"])] = numpy.nan

, который работает, но похоже, ничего не делает

df.mask((df >= df["bottom_quantile"]) | (df <= df["top_quantile"]), inplace = True)

, что вызывает у меня ту же проблему, что и выше.

и:

df.loc[:, (df >= df.count(axis = 1) * .3) & (df <= df.count(axis = 1) * .7)] = numpy.nan

, которая выдает "TypeError: 'Timestamp' «объект не повторяется» (в моем примере это pandas отметка времени, если это имеет значение)

1 Ответ

0 голосов
/ 26 февраля 2020

Не самый красивый или наиболее эффективный в вычислительном отношении ответ, но это сработало:

df = df.apply(lambda x: pandas.Series(numpy.where((x < x.quantile(q = 0.7)) & (x > x.quantile(q = (0.3))), numpy.nan, x), index = x.index), axis = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...