转换百分比分布中的熊猫列的功能

时间:2020-03-19 16:17:48

标签: python-3.x pandas numpy vectorization

我有数据框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 对于{{ 1}}和{1- 0 )= 1 v_a中为200。

所需结果

v_a

1 个答案:

答案 0 :(得分:1)

仅适用于大熊猫的解决方案:

#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