【问题标题】:Pandas separate a dataframe based on percentage of a column's sumPandas 根据列总和的百分比分离数据框
【发布时间】:2019-01-03 19:41:49
【问题描述】:

假设我有一个按比例列从小到大排序的数据框,如下所示:(实际数据框有数千行)

identifier total ratio
1          15     0.21
2          500    0.21
3          70     0.56
4          200    0.75
5          540    0.99

和一个截止值:

cutoff = .3 

最后我想要两个 csv 文件,一个占总数的 30%,比率最低(type1.csv),一个占剩余的 70%(type2.csv)

到目前为止,我尝试只取前 30% 的行,并尝试乘以

total * ratio 

并对该新列进行排序,最后都没有得到正确的列表...

我如何为总列的值分配权重,然后在比率列上削减?

【问题讨论】:

  • s=(df.total*df.ratio).cumsum() s=s/s.iloc[-1] 那么你只需要切片

标签: python pandas


【解决方案1】:

像这样?

cols = ['identifier', 'total', 'ratio']

data = [
[1          ,15    , 0.21],
[2          ,500    ,0.21],
[3          ,70     ,0.56],
[4          ,200    ,0.75],
[5          ,540    ,0.99]
]
import pandas as pd
df = pd.DataFrame(data=data, columns=cols)

df['s']=(df.total*df.ratio).cumsum()
df['cutoff']=df.s/df.s.iloc[-1]

type1 = df[df['cutoff'] < 0.3]
type1[['identifier', 'total', 'ratio']].to_csv(index=False, path_or_buf='type1.csv')


type2 = df[df['cutoff'] >= 0.3]
type2[['identifier', 'total', 'ratio']].to_csv(index=False, path_or_buf='type2.csv')

【讨论】:

  • 你能解释一下“df['cutoff']=df.s/df.s.iloc[-1]”的作用吗?我的截止列全是 0 或 NaN,我没有在它应该在的地方拆分。
  • 我的数据框中有无穷大,已修复。
  • df['cutoff']=df.s/df.s.iloc[-1] 只是设置了一个额外的列,以便您可以从一帧中看到要剪切数据集的位置给另一个。您可以压缩代码以避免此步骤,但认为这有助于说明。在这种情况下,df.s.iloc[-1] 相当于 df.s.sum(),尽管后者的性能会稍差一些。所以输出将是一个比率。这有意义吗?
  • 确实如此!感谢您的解释和所有的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2017-09-04
  • 2023-04-01
相关资源
最近更新 更多