Функция для преобразования столбца pandas в процентное распределение - PullRequest
1 голос
/ 19 марта 2020

У меня есть фрейм данных 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 в процентное распределение.

Например: число 250 в df лежит между 200 и 400 в v_a, затем (400-250) / (400-200) = 0,75 это процент, которому он принадлежит 200 и (1 - 0,75 ) = 0,25 это процент, которому он принадлежит 400.

Аналогично, число 400 в df лежит между 200 и 400 в v_a ((400-400) / (400-200) = 0 для 400 в v_a и (1- 0 ) = 1 для 200 дюймов v_a).

желаемый результат :

   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

1 Ответ

1 голос
/ 19 марта 2020

Решение только с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...