python - 基于百分位数的类别分配

标签 python pandas

我有以下数据框

Group Country GDP

    A     a       ***
    A     b       ***
    B     a       ***
    B     b       ***

我想通过创建一个新列,根据组内百分位排名将类别分配给 gdp(高,低)。 这是我试过的

    def c(gr):
        ser=gr['gdp']
        p=np.nanpercentile(ser,50)
        for i in ser:
            if i>p:
                return "high"
            else:
                return "low"

grouped = df.groupby('Group')
df['perf']=grouped.apply(c)

Perf 列正在返回 nan。我在这里做错了什么?

最佳答案

quantilenumpy.where 和自定义函数一起使用:

def c(gr):
    ser=gr['gdp']
    #q=0.5 is by default, so can be omit 
    p = ser.quantile()
    gr['perf'] = np.where( ser > p, 'high', 'low')
    return gr

df = df.groupby('Group').apply(c)

这可以通过 transform 简化:

q = df.groupby('Group')['gdp'].transform('quantile')
df['perf1'] = np.where(df['gdp'] > q, 'high', 'low')

示例:

np.random.seed(12)

N = 15
L = list('abcd') 
df = pd.DataFrame({'Group': np.random.choice(L, N),
                   'gdp': np.random.rand(N)})
df = df.sort_values('Group').reset_index(drop=True)
df.loc[[0,4,5,10,13,14], 'gdp'] = np.nan
#print (df)

def c(gr):
    ser=gr['gdp']
    #q=0.5 is by default, so can be omit 
    p = ser.quantile()
    gr['perf'] = np.where( ser > p, 'high', 'low')
    return gr

df = df.groupby('Group').apply(c)

q = df.groupby('Group')['gdp'].transform('quantile')
df['perf1'] = np.where( df['gdp'] > q, 'high', 'low')
print (df)
   Group       gdp  perf perf1
0      a       NaN   low   low
1      a  0.907267  high  high
2      a  0.456051   low   low
3      b  0.675998   low   low
4      b       NaN   low   low
5      b       NaN   low   low
6      b  0.563141   low   low
7      b  0.801265  high  high
8      c  0.372834   low   low
9      c  0.481530  high  high
10     c       NaN   low   low
11     d  0.082524   low   low
12     d  0.725954  high  high
13     d       NaN   low   low
14     d       NaN   low   low

关于python - 基于百分位数的类别分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46024750/

相关文章:

python - 将 pandas 中的两列相乘

python - 函数 cv2.detectAndCompute 和 cv2.compute 上的 opencv 3 python 特征检测错误

python - 在python中删除文件的权限问题

python - 我可以在 selenium 运行时最小化 chrome 窗口吗?

python - 在 Pandas 中将通话数据拆分为 15 分钟的间隔

python - MultiIndex 列 DataFrame 的成对差异

python - 具有基于列名称的图例的 T-SNE 散点图

javascript - Match Regex 命令检查一次且仅一次出现 [+,-,/,*,U,D]

python - 在 Pandas 数据框中进行行相关的正确方法

python - 检查工作簿中的工作表并在缺少时添加