В то время как l oop в столбце данных? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть небольшой фрейм данных, состоящий из двух столбцов, столбца ORG и столбца процента. Кадр данных сортируется по возрастанию от наименьшего к столбцу процента.

Я хотел бы создать время l oop, которое складывает значения в столбце процента до тех пор, пока не достигнет значения 0,80 (80%).

До сих пор я пробовал:

retail_pareto = 0
counter = 0
while retail_pareto < .80:
    retail_pareto += retailerDF[counter]['RETAILER_PCT_OF_CHANGE']
    counter += 1

Это не работает, и счетчик, и счетчик, и значение retail_pareto остаются на нуле без реального сообщения об ошибке, чтобы помочь мне устранить неполадки, которые я делаю неправильно. В идеале я хотел бы получить список организаций с самым большим процентом, которые вместе составляют до 80%.

Я не совсем уверен, что попробовать дальше. Я искал эти форумы, но пока не нашел ничего похожего на форумах.

Любой совет или помощь высоко ценится. Спасибо.

Example Dataframe:
ORG    PCT
KST    0.582561
ISL    0.290904
BOV    0.254456
BRH    0.10824
GNT    0.0913631
DSH    0.023441
RDM    -0.0119665
JBL    -0.0348893
JBD    -0.071883
WEG    -0.232227



The output that I would expect would be something along the lines of:
ORG    PCT
KST    0.582561
ISL    0.290904

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Использование:

df_filtered = df.loc[df['PCT'].shift(fill_value=0).cumsum().le(0.80),:]
#if you don't want include where cumsum is greater than 0,80
#df_filtered = df.loc[df['PCT'].cumsum().le(0.80),:] 
print(df_filtered)
   ORG       PCT
0  KST  0.582561
1  ISL  0.290904
1 голос
/ 10 марта 2020

Вместо вашего l oop, используйте более pandasoni c подход. Начните с вычисления дополнительного столбца, содержащего совокупную сумму RETAILER_PCT_OF_CHANGE :

df['pct_cum'] = df.RETAILER_PCT_OF_CHANGE.cumsum()

Для ваших данных результат будет:

   ORG  RETAILER_PCT_OF_CHANGE   pct_cum
0  KST                0.582561  0.582561
1  ISL                0.290904  0.873465
2  BOV                0.254456  1.127921
3  BRH                0.108240  1.236161
4  GNT                0.091363  1.327524
5  DSH                0.023441  1.350965
6  RDM               -0.011967  1.338999
7  JBL               -0.034889  1.304109
8  JBD               -0.071883  1.232226
9  WEG               -0.232227  0.999999

А теперь, чтобы напечатать строки который включает в себя 80% изменений, заканчивающихся в первой строке выше лимита, запустите:

df[df.pct_cum.shift(1).fillna(0) < 0.8]

Результат вместе с накопленной суммой:

   ORG  RETAILER_PCT_OF_CHANGE   pct_cum
0  KST                0.582561  0.582561
1  ISL                0.290904  0.873465
1 голос
/ 10 марта 2020

Можете ли вы использовать этот пример, чтобы помочь вам?

import pandas as pd

retail_pareto = 0
orgs = []
for i,row in retailerDF.iterrows():
    if retail_pareto <= .80:
        retail_pareto += row['RETAILER_PCT_OF_CHANGE']
        orgs.append(row)
    else:
        break

new_df = pd.DataFrame(orgs)

Изменить: сделал его более похожим на ваш пример и добавил новый DataFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...