Ben*_*key 4 python for-loop numpy pandas
我想通过对 df2 中每个相关日期求和来填充空列“web”“mob”app“
df1:
id start end web mob app
12345 2018-01-17 2018-01-20
12346 2018-01-19 2018-01-22
12347 2018-01-20 2018-01-23
12348 2018-01-20 2018-01-23
12349 2018-01-21 2018-01-24
Run Code Online (Sandbox Code Playgroud)
df2:
id date web mob app
12345 2018-01-17 7 17 10
12345 2018-01-18 9 18 7
12345 2018-01-19 3 19 15
12345 2018-01-20 6 17 8
12345 2018-01-21 8 9 13
12345 2018-01-22 4 15 12
12345 2018-01-23 8 11 13
12345 2018-01-24 9 16 14
12346 2018-01-17 3 17 12
12346 2018-01-18 4 19 4
12346 2018-01-19 6 13 10
12346 2018-01-20 1 15 6
12346 2018-01-21 4 12 11
12346 2018-01-22 5 20 12
12346 2018-01-23 8 13 14
12346 2018-01-24 6 18 8
Run Code Online (Sandbox Code Playgroud)
这个 for 循环将填充“web”列:
column = []
for i in df1.index:
column.append(df2[(df2['date'] >= df1['start'].iloc[i])
& (df2['date'] <= df1['end'].iloc[i])
& (df2['id'] == df1['id'].iloc[i])].sum()['web'])
df1['web'] = column
Run Code Online (Sandbox Code Playgroud)
我希望能够用一个 for 循环填充所有 3 列,而不是执行 3 个单独的循环。
我有一种感觉,使用类似附加这个的东西
.agg({'web':'sum', 'mob':'sum', 'app':'sum'})
Run Code Online (Sandbox Code Playgroud)
二维列表可能是答案。
另外...有没有比使用 for 循环更有效的方法?也许通过使用 numpy.where ?我发现在大型数据集上运行多个 for 循环可能非常非常慢。
国际大学学院
s=df1.merge(df2,on='id',how='left')
output=s[(s.start<=s.date)&(s.end>=s.date)].groupby('id').sum()
output
Out[991]:
web mob app
id
12345 25.0 71.0 40.0
12346 16.0 60.0 39.0
Run Code Online (Sandbox Code Playgroud)
然后我们merge再次使用
df1.merge(output.reset_index(),how='left').fillna(0)
Out[995]:
id start end web mob app
0 12345 2018-01-17 2018-01-20 25.0 71.0 40.0
1 12346 2018-01-19 2018-01-22 16.0 60.0 39.0
2 12347 2018-01-20 2018-01-23 0.0 0.0 0.0
3 12348 2018-01-20 2018-01-23 0.0 0.0 0.0
4 12349 2018-01-21 2018-01-24 0.0 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3760 次 |
| 最近记录: |