python - 计算列值满足不同条件的次数百分比

标签 python pandas dataframe

我有一个像下面这样的 DataFrame,只有大约 25 列和 3000 行。我需要第二个 DF,它显示 df_A 中每列中的所有行 >= df_B 中的目标的次数百分比。

例如,在 df_A 中,列 d02 五分之三(列的长度)>= .04,因此在 df_B 中应反射(reflect)为 60%。

我知道如何分别进行比较和百分比,但我不知道如何将所有内容放在一起并填充新的 DF。

df_A        

     d01    d02    d03   
0  0.028  0.021  0.028    
1  0.051  0.063  0.093    
2  0.084  0.084  0.084     
3  0.061  0.061  0.072   
4  0.015  0.015  0.015

目标...

df_B

  target    d01   d02   d03 
    .02     p     p     p
    .04     p    .60    p
    .06     p     p     p
    .08     p     p     p
    .15     p     p     p
    .20     p     p     p
    .25     p     p     p
    .30     p     p     p

最佳答案

一种方法是使用numpy:

a, t, n = df_A.values, df_T.values, len(df_A.index)
res = np.zeros((len(df_T.index), len(df_A.columns)))

for i in range(res.shape[0]):
    for j in range(res.shape[1]):
        res[i, j] = np.sum(a[:, j] >= t[i]) / n

result = df_T.join(pd.DataFrame(res, columns=df_A.columns))

设置

df_A:

     d01    d02    d03
0  0.028  0.021  0.028
1  0.051  0.063  0.093
2  0.084  0.084  0.084
3  0.061  0.061  0.072
4  0.015  0.015  0.015

df_T:

   target
0    0.02
1    0.04
2    0.06
3    0.08
4    0.15
5    0.20
6    0.25
7    0.30

结果

   target  d01  d02  d03
0    0.02  0.8  0.8  0.8
1    0.04  0.6  0.6  0.6
2    0.06  0.4  0.6  0.6
3    0.08  0.2  0.2  0.4
4    0.15  0.0  0.0  0.0
5    0.20  0.0  0.0  0.0
6    0.25  0.0  0.0  0.0
7    0.30  0.0  0.0  0.0

性能基准测试

可以使用numba进一步优化numpy版本。

%timeit allen(df_A, target)  # 40ms
%timeit louis(df_A, target)  # 7.79ms
%timeit jpp(df_A, df_T)      # 4.29ms

df_A = pd.concat([df_A]*10)
df_T = pd.concat([df_T]*5)
target = [.02, .04, .06, .08, .15, .20, .25, .30] * 5

def allen(df_A, target):
    df_B = pd.DataFrame(index=target, columns=df_A.columns).rename_axis('target',axis=0)
    return df_B.apply(lambda x: df_A.ge(x.name).sum().div(len(df_A)), axis=1).reset_index()

def jpp(df_A, df_T):
    a, t, n = df_A.values, df_T.values, len(df_A.index)
    res = np.zeros((len(df_T.index), len(df_A.columns)))

    for i in range(res.shape[0]):
        for j in range(res.shape[1]):
            res[i, j] = np.sum(a[:, j] >= t[i]) / n

    return df_T.join(pd.DataFrame(res, columns=df_A.columns))

def louis(df_A, target):
    dic = {key: [] for key in df_A}

    for t in target:
        for key in dic:
            s = 0
            for val in df_A[key]:
                if val >= t:
                    s += 1
            dic[key].append(s / len(df_A[key]))

    return pd.DataFrame(data = dic, index = target)

关于python - 计算列值满足不同条件的次数百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142309/

相关文章:

python - python 集合可以包含的值的数量是否有限制?

python - 操作方法 : git show hexsha:directorypath/file

python - 如何通过两个日期列对 Pandas 数据框进行排序

r - 使用公式转换数据框

python - Pandas 改变列的顺序

python - Pandas 相关矩阵与 value_counts 列字符串

Python坐标转换ECI到ECEF

python - Pandas 条件滚动计数

python - 如何找到 ndarray 中索引的值并将其转换为 pandas Dataframe?

python - 使用 df.iterrows() 时删除 Pandas 数据框中的一行