转换百分比分布中 pandas 列的函数

Function to transform pandas column in percentage distribution

我有数据框 df 和列表 v_a:

import pandas as pd
data = {'A':[250,100,400,300,210]}
df = pd.DataFrame(data)
print(df)

v_a = [0,200,400,600]

问题: 我想创建一个函数,将 df 中的数据框列转换为百分比分布。

例如: df 中的数字 250 在 v_a 中介于 200 和 400 之间,则 (400-250)/(400-200) = 0.75 是它属于 200 的百分比和 (1 - 0.75) = 0.25 是它属于的百分比400.

同样,df中的数字 400 位于 v_a 中的 200 和 400 之间((400-400)/(400-200) = 0对于 v_a 中的 400 和 (1-0) = 1 对于 v_a 中的 200).

想要的结果:

   0     200   400  600
0  0.0  0.75  0.25  0.0
1  0.5  0.50  0.00  0.0
2  0.0  0.00  1.00  0.0
3  0.0  0.50  0.50  0.0
4  0.0  0.95  0.05  0.0

只有pandas的解决方案:

#Get DataFrame with intervals
df2 = pd.DataFrame([[interval.left, interval.right] 
                    for interval in pd.cut(df['A'], v_a)],
                   columns=['col1', 'col2'])

#calculate values
df2['val2']=(df2['col2'].sub(df['A'])
                        .div(df2['col2'].sub(df2['col1']))
                        .clip(upper=1, lower=0))
df2['val1'] =  1 - df2['val2']

#print(df2)
#   col1  col2  val2  val1
#0   200   400  0.75  0.25
#1     0   200  0.50  0.50
#2   200   400  0.00  1.00
#3   200   400  0.50  0.50
#4   200   400  0.95  0.05

#Get the correct format
new_df = (pd.wide_to_long(df2.reset_index(),
                          ['col', 'val'],
                          i='index',
                          j='type') 
            .pivot_table(index='index',columns='col',values='val')
            .reindex(columns=v_a)
            .fillna(0)
            .rename_axis(columns=None, index=None))

输出

print(new_df)

#   0     200   400  600
#0  0.0  0.25  0.75  0.0
#1  0.5  0.50  0.00  0.0
#2  0.0  1.00  0.00  0.0
#3  0.0  0.50  0.50  0.0
#4  0.0  0.05  0.95  0.0