【问题标题】:how to sum up supply counts within day range如何总结一天范围内的供应数量
【发布时间】:2020-01-26 07:17:11
【问题描述】:

我有列:ID、供应数量、天数。

我想为从第 1 天到第 60 天供应计数 >=100 的 ID 赋予值 1;否则为 0。

天数范围(-30,100)

每个ID在他获得供应的那天都有一行记录。例如ID(1),供应计数(10),第(-5)天。

我尝试了什么:

df.loc[(0<df.days)&(df.days<=60)]

groupby('id').sum()

np.where((supply counts>100) , '1', '0')

问题是如果任何 id 没有从 days0 到 60 的记录,id 就会丢失。

数据样本。

  id    supply  days
    1   15   -10
    1   20    5
    1   325   15
    2   10    -20
    2   50    10
    3   20    -30






id  y            
1   1
2   0

【问题讨论】:

  • 您应该格式化您的代码并提供一些示例数据。
  • 你能从你的样本数据中添加预期的输出吗?

标签: python pandas numpy jupyter-notebook


【解决方案1】:

首先按boolean indexing 过滤,然后仅针对supply 列聚合sum,并且由于可能会过滤掉一些id 值,因此添加Series.reindex by Series.unique 原始值。最后Series.reset_index 用于将Series 转换为DataFrame 并添加带有DataFrame.pop 的新y 列以提取supply

df1 = df[(df.days > 0)&(df.days<=60)]
df2=df1.groupby('id')['supply'].sum().reindex(df['id'].unique(), fill_value=-1).reset_index()
df2['y'] = np.where(df2.pop('supply') > 100, 1, 0)
print (df2)
   id   y
0   1   1
1   2   0
2   3   0

编辑:如果需要删除过滤器 id 行:

df1 = df[(df.days > 0)&(df.days<=60)]
df2=df1.groupby('id', as_index=False)['supply'].sum()
df2['y'] = np.where(df2.pop('supply') > 100, 1, 0)
print (df2)
   id  y
0   1  1
1   2  0

替代解决方案:

df2 = (df.query("0 < days <=60") 
         .groupby('id')['supply'].sum()
         .reindex(df['id'].unique(), fill_value=-1)
         .rename('y')
         .gt(100)
         .astype(int)
         .reset_index()
       )
print (df2)
   id  y
0   1  1
1   2  0
2   3  

df2 = (df.query("0 < days <=60") 
         .groupby('id')['supply'].sum()
         .rename('y')
         .gt(100)
         .astype(int)
         .reset_index()
       )
print (df2)
   id  y
0   1  1
1   2  0

【讨论】:

  • 与 df.loc[(0
  • @Yuuu - 那么在这种情况下预期的输出是什么?包含 3 且没有值 suply 和天数的新行?
  • 如果我在条件下扩大我的日期范围,我会得到所有 id。
  • @Yuuu - 我更改了您问题中的数据样本。你可以添加预期的输出吗?最后应该怎么看数据?
  • 太棒了,用 -1 填充值。天才。非常感谢!
【解决方案2】:

按照我的理解,可能是你需要的。

s = (df.Days>0) & (df.Days<=60)
df['ID_new']= np.where ((s) & (df.supply_counts>=100), 1,0)

输入

   ID   supply_counts   Days
0   1   135             -15
1   1   70               67
2   1   90               38
3   1   80               49
4   1   68               71
5   2   116              85
6   1   81               91
7   2   62               15
8   1   112               1 
9   1   115               65
10  2   87               51
11  1   105              -9
12  1   107               2
13  2   66               79
14  2   92               46

输出


    ID  supply_counts   Days    ID_new
0   1   135             -15     0
1   1   70               67     0
2   1   90               38     0
3   1   80               49     0
4   1   68               71     0
5   2   116              85     0
6   1   81               91     0
7   2   62               15     0
8   1   112               1     1
9   1   115               65    0
10  2   87               51     0
11  1   105              -9     0
12  1   107               2     1
13  2   66               79     0
14  2   92               46     0

如果supply_counts的总和>100,如果每个id的总和需要为1,那么下面的代码将起作用。

df2 = df.groupby('id').sum().reset_index()
s = (df2.days>0) & (df2.days<=60)
df2['y']= np.where ((s) & (df2.supply>=100), 1,0)
df2[['id','y']]

输出

   id   y
0   1   1
1   2   0
2   3   0

【讨论】:

  • 如果supply_counts >100 的总和,我想要给每个id 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多