python - Pandas 在列中设置的值等于 5% 分位数,如果它们小于该分位数
问题描述
生成数据
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% 分位数。
我已经阅读了这些问题
并提出我的解决方案:
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
推荐阅读
- sass - options 具有未知属性“prependData”。这些属性是有效的:
- android - 无法覆盖 Kotlin(Volley)中的 getParam
- python - 通过在列中创建列名行来转换 padnas 数据框
- swift - 尝试从协议中调用类方法(Swift)
- python - Python Sockets 发送 Uint16 和 Uint32
- apache-kafka - 使用 Kafka Connect 和 Debezium 将表复制到 Kafka 时的性能问题
- javascript - 如何在javascript中从另一个数组中减去一个数组
- php - Cloudinary 视频上传错误 Entity too large up to 300MB
- gitlab - 如何保护gitlab中的标签不被其他成员删除?
- python - 当键的值是列表列表时,如何将字典转换为数据框?