python - 将同一操作的多个突出列添加到 pandas DataFrame
问题描述
问题
假设我有一个df
带有数字列x
和分类列的 DataFrame y
。我想计算q
和高于每组quantile of q
的。使用这两个值和,我想计算低于 的元素数。为此,我从 开始并不断增加,直到大于。quantile of q
0
y
q
quantile of q
quantile of q
q=0
q
0.05
quantile of q
0
解决方案
groups = df.groupby(y_col)
less_quantile = np.empty(len(groups))
quantiles = np.empty(len(groups))
qs = np.empty(len(groups))
for i, (_, group) in zip(range(len(groups)), groups):
q = 0.0
while q <= 1.0:
quantile = group[x_col].quantile(q)
if quantile > 0.0:
less_quantile[i] = (group[x_col] < quantile).sum() #count Trues
qs[i] = q
quantiles[i] = quantile
break
q += 0.05
df_final = df.drop_duplicates(y_col)\
.assign(quantile=quantiles, q=qs, less_quantile_count=less_quantile)
问题
上述实现存在以下问题:
- 我没有使用任何 pandas 或 numpy 优化(例如矢量化)。
- pandas 不保证这一点,
drop_duplicates
并且groupby
将具有相同的组顺序来按照我的方式分配它。我这样做的唯一原因是通过实验它们是相同的。
我还有哪些其他选择?
- 使用
agg
或apply
和merge
- 创建空列来计算和复制 qs,然后是分位数,然后计算小于分位数的列
它还能引起什么其他问题?
- 我可能需要多次重新计算分位数。
- 我将在每组的每一行中使用重复值占用大量内存。
我为什么要关心这个?
作为一名 C 程序员,不必要地使用如此多的内存并且在操作中使用相同的内存是很痛苦的。也因为它是一个小的 DataFrame 我可以很容易地解决它,但是如果 DataFrame 太大,我应该知道最好的方法来做到这一点。我不确定这是否是由于它的抽象级别而对库的限制,或者我是否知道足够的知识来解决问题。
编辑 1 - 添加了一个示例
x y
0 pear 0.0
1 pear 0.0
2 pear 0.194329
3 apple 0.714319
4 apple 0.171905
5 apple 0.337234
6 apple 0.769216
7 orange 0.529154
8 orange 0.844691
# Let's take pear as an example:
quantile = group_pear.quantile(0) # 0.0
quantile = group_pear.quantile(0.05) # 0.0
...
quantile = group_pear.quantile(0.50) # 0.0
quantile = group_pear.quantile(0.55) # 0.09857
q = 0.55
# Found quantile of q with q=0.55 resulting in 0.09857
# Now I just need to count how many rows within the pear group have 'y'
# less than 0.09857
count_pear = (group_pear['y'] < 0.09857).sum()
# I just need to do the same for other groups and then produce a
# DataFrame like this
x q quantile count_less
0 pear 0.55 0.09857 2
1 apple 0.0 ... ...
2 orange 0.0 ... ...
解决方案
推荐阅读
- postman - Postman Collection Runner 运行陈旧的请求。解决方案?
- spring - 在不启动完整应用程序的情况下测试 Spring Boot Actuator 端点
- python - 在 Python 中创建 JSON 对象
- java - 使用 Yaw/Pitch/Roll 渲染 Java 3D 对象
- php - 这是什么语句 => ($value ? $value : 0)
- heroku - Heroku worker dynos 上的 FFMPEG 耗时太长 - 遇到超时错误
- javascript - 数据表 - 按字符串搜索,而不是子字符串
- sql - 交叉应用/透视此数据?
- jquery - 在 HTML 字符串中查找元素的文本
- amazon-web-services - Redshift 存储过程无法按预期工作