我有数据框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
答案 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