转换百分比分布中 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
我有数据框 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