首页 > 解决方案 > 将同一操作的多个突出列添加到 pandas DataFrame

问题描述

问题

假设我有一个df带有数字列x和分类列的 DataFrame y。我想计算q和高于每组quantile of q的。使用这两个值和,我想计算低于 的元素数。为此,我从 开始并不断增加,直到大于。quantile of q0yqquantile of qquantile of qq=0q0.05quantile of q0

解决方案

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)

问题

上述实现存在以下问题:

我还有哪些其他选择?

  1. 使用aggapplymerge
  2. 创建空列来计算和复制 qs,然后是分位数,然后计算小于分位数的列

它还能引起什么其他问题?

  1. 我可能需要多次重新计算分位数。
  2. 我将在每组的每一行中使用重复值占用大量内存。

我为什么要关心这个?

作为一名 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   ...       ...

标签: pythonpandasnumpyoptimization

解决方案


推荐阅读