为了账号安全,请及时绑定邮箱和手机立即绑定

在数据帧列上循环时?

在数据帧列上循环时?

人到中年有点甜 2022-08-25 13:41:16
我有一个由两列组成的小数据帧,一列是ORG列和一列百分比列。数据帧根据百分比列从大到小排序。我想创建一个 while 循环,将百分比列中的值相加,直到达到 .80 (80%) 的值。到目前为止,我已经尝试过:retail_pareto = 0counter = 0while retail_pareto < .80:    retail_pareto += retailerDF[counter]['RETAILER_PCT_OF_CHANGE']    counter += 1这不起作用,计数器和计数器以及retail_pareto值都保持在零,没有真正的错误消息来帮助我解决我做错了什么。理想情况下,我想得到一个列表,列出加起来加起来占80%的最大百分比的组织。我不确定下一步该尝试什么。我已经搜索了这些论坛,但还没有在论坛中找到类似的东西。任何建议或帮助都非常感谢。谢谢。Example Dataframe:ORG    PCTKST    0.582561ISL    0.290904BOV    0.254456BRH    0.10824GNT    0.0913631DSH    0.023441RDM    -0.0119665JBL    -0.0348893JBD    -0.071883WEG    -0.232227The output that I would expect would be something along the lines of:ORG    PCTKST    0.582561ISL    0.290904
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

你能用这个例子来帮助你吗?


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)

编辑:使其更像您的示例,并添加了新的数据帧。


查看完整回答
反对 回复 2022-08-25
?
皈依舞

TA贡献1851条经验 获得超3个赞

而不是循环,采取一种更乐观的方法。首先计算包含累积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


查看完整回答
反对 回复 2022-08-25
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

用:


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


查看完整回答
反对 回复 2022-08-25
  • 3 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号