python - 如果 Pandas 小于该值,则将列中的值设置为等于 5% 分位数

标签 python pandas dataframe quantile

生成数据

random.seed(42)
date_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')
df = pd.DataFrame(np.random.randint(0,10,size=(len(date_rng), 3)),
                  columns=['data1', 'data2', 'data3'],
                 index= date_rng)
mask = np.random.choice([1, 0], df.shape, p=[.35, .65]).astype(bool)
df[mask] = np.nan

我想做以下操作:计算每列的 5% 分位数,然后将该列中每个单元格的值与计算的分位数进行比较:如果它们较小,则将它们设置为该列的 5% 分位数.

我已阅读这些问题

Pandas DataFrame: replace all values in a column, based on condition

Replacing values greater than a number in pandas dataframe

并提出我的解决方案:

df[df < df.quantile(q=0.05, axis=0)] = df.quantile(q=0.05, axis=0)

但它不起作用,因为我试图用一个系列替换每个值。我怎么解决这个问题?谢谢

最佳答案

您可以通过 DataFrame.quantile 获取分位数所有列并将其传递给 DataFrame.clip .

np.random.seed(42)
date_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')
df = pd.DataFrame(np.random.randint(0,10,size=(len(date_rng), 3)),
                  columns=['data1', 'data2', 'data3'],
                 index= date_rng)
mask = np.random.choice([1, 0], df.shape, p=[.35, .65]).astype(bool)
print (df)
                     data1  data2  data3
2018-01-01 00:00:00      6      3      7
2018-01-01 01:00:00      4      6      9
2018-01-01 02:00:00      2      6      7
2018-01-01 03:00:00      4      3      7
2018-01-01 04:00:00      7      2      5
                   ...    ...    ...
2018-01-07 20:00:00      7      6      4
2018-01-07 21:00:00      0      6      6
2018-01-07 22:00:00      8      2      8
2018-01-07 23:00:00      0      0      3
2018-01-08 00:00:00      8      5      2

为了测试,使用不同的分位数:

print (df.quantile(q=0.55))
data1    6.0
data2    4.0
data3    5.0
Name: 0.55, dtype: float64

df = df.clip(lower=df.quantile(q=0.55), axis=1)
print (df)
                     data1  data2  data3
2018-01-01 00:00:00      6      4      7
2018-01-01 01:00:00      6      6      9
2018-01-01 02:00:00      6      6      7
2018-01-01 03:00:00      6      4      7
2018-01-01 04:00:00      7      4      5
                   ...    ...    ...
2018-01-07 20:00:00      7      6      5
2018-01-07 21:00:00      6      6      6
2018-01-07 22:00:00      8      4      8
2018-01-07 23:00:00      6      4      5
2018-01-08 00:00:00      8      5      5

关于python - 如果 Pandas 小于该值,则将列中的值设置为等于 5% 分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59465357/

相关文章:

python - 如何在 python 中创建带循环的元组

python - 仅当新条目进入 Django 数据库时更新客户端页面

python - 如何在 Altair 中向多面图表添加图层?

python - LabelEncoder().fit_transform 与用于分类编码的 pd.get_dummies

python - pandas 在奇数行取平均值

python - 查找数字数据帧的数字根

python - 访问位于应用程序文件夹上一级目录的 SQLite3 数据库

python - 我如何 json_normalize() df 中的特定字段并保留其他列?

performance - Pandas 系列与单个向量的相关性

python - 如何使用 Pandas 将某些行视为新列