繁体   English   中英

如何根据条件 pandas dataframe 计算每列特定值的出现次数及其百分比?

[英]How to compute occurrencies of specific value and its percentage for each column based on condition pandas dataframe?

我有以下 dataframe df,其中我以绿色突出显示具有感兴趣值的单元格:在此处输入图像描述,我想为每一列(因此通过考虑整个数据帧)获得以下统计数据:值的出现小于或等于 0.5(数据框中的绿色单元格)-不包括 Nan 值-及其在所考虑列中的百分比,以便使用 50% 作为基准。

对于所问的问题,我尝试使用 value_count,例如 (df['A'].value_counts()/df['A'].count())*100,但这会返回部分结果,而不是我想要的方式,并且仅针对特定的列; 我也在考虑使用过滤器或 lamba function 像 df.loc[lambda x: x <= 0.5] 但显然这不是我想要的结果。

目标/输出将是 dataframe,如下所示,其中仅显示“击败”基准的列(回想一下:至少(一半)50% 的值 <= 0.5)。

在此处输入图像描述例如,在 A 列中,计数为 2,百分比:2/3 * 100 = 66%,而在 B 列中,计数为 4,百分比:4/8 * 100 = 50%。 (同样适用于 X、Y 和 Z 列)。 另一方面,在 C 列中,2/8 *100 = 25% 不会超过基准,因此不会在 output 中考虑。

有没有合适的方法来实现这个IYHO? 如果这是一个有点重复的问题,请提前道歉,但我发现没有其他问题可以帮助我,并感谢任何救世主。

我相信我已经理解了你在下面代码中的问题......如果你能在你的问题中提供预期的 output 以便更容易理解,那就太好了。

无论如何,下面代码的第一部分刚刚设置好,所以可以忽略,因为您已经设置了数据。 基本上,我已经为您创建了一个快速 function,它将返回低于您可以定义的阈值的值的百分比。 这个 function 在 dataframe 中所有列的循环中被调用,如果这个百分比超过 output 阈值(你可以再次定义它)它会保留它用于实际输出。

import pandas as pd
import numpy as np
import random
import datetime

### SET UP ###

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(10)]

def rand_num_list(length):
    peak = [round(random.uniform(0,1),1) for i in range(length)] + [0] * (10-length)
    random.shuffle(peak)
    return peak


df = pd.DataFrame(
    {
        'A':rand_num_list(3),
        'B':rand_num_list(5),
        'C':rand_num_list(7),
        'D':rand_num_list(2),
        'E':rand_num_list(6),
        'F':rand_num_list(4)
    },
    index=date_list
)

df = df.replace({0:np.nan})

##############

print(df)

def less_than_threshold(thresh_df, thresh_col, threshold):
    if len(thresh_df[thresh_col].dropna()) == 0:
        return 0

    return len(thresh_df.loc[thresh_df[thresh_col]<=threshold]) / len(thresh_df[thresh_col].dropna())

output_dict = {'cols':[]}
col_threshold = 0.5
output_threshold = 0.5
for col in df.columns:
    if less_than_threshold(df, col, col_threshold) >= output_threshold:
        output_dict['cols'].append(col)
    
df_output = df.loc[:,output_dict.get('cols')]

print(df_output)

希望这能实现你的目标!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM