pandas - 使用 for 循环将多列附加到数据帧

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 循环可能非常非常慢。

WeN*_*Ben 5

国际大学学院

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)