У меня есть фрейм данных с построчным восходящим рангом других значений (через 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 отметка времени, если это имеет значение)