Python 如何总结日内的供应数量
我有列:ID、供应数量、天数 我想为从第1天到第60天供应计数>=100的ID指定值1;其他0 天数范围(-30100) 每个ID都有一行记录,记录他获得补给的那天。例如ID(1),补给计数(10),第(-5)天 我尝试的是: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,并且
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