Python 如何总结日内的供应数量

Python 如何总结日内的供应数量,python,pandas,numpy,jupyter-notebook,Python,Pandas,Numpy,Jupyter Notebook,我有列:ID、供应数量、天数 我想为从第1天到第60天供应计数>=100的ID指定值1;其他0 天数范围(-30100) 每个ID都有一行记录,记录他获得补给的那天。例如ID(1),补给计数(10),第(-5)天 我尝试的是: df.loc[(0<df.days)&(df.days<=60)] groupby('id').sum() np.where((supply counts>100) , '1', '0') 首先按筛选,然后仅为supply列聚合sum,并且

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

我想为从第1天到第60天供应计数>=100的ID指定值1;其他0

天数范围(-30100)

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

我尝试的是:

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

groupby('id').sum()

np.where((supply counts>100) , '1', '0')
首先按筛选,然后仅为
supply
列聚合
sum
,并且由于可能会筛选出一些
id
值,所以按原始值相加。最后用于将
系列
转换为
数据帧
,并添加新的
y
列,用于提取
供应

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
替代解决方案:

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
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
   id   y
0   1   1
1   2   0
2   3   0
如果每个id的总和大于100,则需要将结果设为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']]

您应该格式化代码并提供一些示例数据。您可以从示例数据中添加预期输出吗?与df.loc的情况相同[(0@Yuuu-那么在这种情况下预期的输出是什么?新行有
3
并且没有值
suply
和天?如果我在条件中扩大我的天范围,我会得到所有id。@Yuuu-我在你的问题中更改了数据样本。你能添加导出的输出吗?数据最终应该看起来如何?太棒了,用-1填充值。天才。非常感谢!什么如果供应量之和大于100,我希望为每个id提供1。

    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
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