我有两个像这样的pandas数据帧:
category time day 1 2 3
a 24 1 15 35 20
a 22 1 40 35 15
category day time total
b 1 19 10
b 1 20 10
b 1 21 10
b 1 22 10
b 1 23 10
b 1 24 10
b 2 1 10
a 1 0 10
a 1 1 10
a 1 2 10
a 1 3 10
a 1 4 10
a 1 5 10
a 1 6 10
a 1 7 10
a 1 8 10
a 1 9 10
a 1 10 10
a 1 11 10
a 1 12 10
a 1 13 10
a 1 14 10
a 1 15 10
a 1 16 10
a 1 17 10
a 1 18 10
a 1 19 10
a 1 20 10
a 1 21 10
a 1 22 10
a 1 23 10
a 1 24 10
a 2 1 10
我想将第一个数据帧中第2列的元素添加到第二个数据帧中的相应元素,列'1'中的元素应添加到上面的单元格中,并将列中的元素添加到第3个数据帧中到细胞爱好
渲染此结果:
category day time total
b 1 19 10
b 1 20 10
b 1 21 10
b 1 22 10
b 1 23 10
b 1 24 10
b 2 1 10
a 1 0 10
a 1 1 10
a 1 2 10
a 1 3 10
a 1 4 10
a 1 5 10
a 1 6 10
a 1 7 10
a 1 8 10
a 1 9 10
a 1 10 10
a 1 11 10
a 1 12 10
a 1 13 10
a 1 14 10
a 1 15 10
a 1 16 10
a 1 17 10
a 1 18 10
a 1 19 10
a 1 20 10
a 1 21 10 + 40
a 1 22 10 + 35
a 1 23 10 + 15 + 15
a 1 24 10 + 35
a 2 1 10 + 20
现在我使用循环,但它要慢,我需要更快的东西:
for row in df_1:
date = row[0]
time = row[1]
category = row[2]
total = row[3:]
index = df_2.index[(df_2['date'] == date) & (df_2['time'] == time)].[0] & (df_2['category'] == category)]
df_2['total'].iloc[index - 1 : index + 1 + 1 ] = df_2['total'].iloc[index - 1 : index + 1 + 1] + total
有没有一种使用熊猫的好方法?我应该将第二个数据框的索引设置为“day”和“time”以便能够快速检索它们吗?我有一个非常大的数据集,所以我选择的方法很快就很重要。
答案 0 :(得分:1)
让我们看看这是否更快:
df11 = df1.melt(['time','day'])
df12 = (df11.rename(columns={'value':'total'})
.set_index(['day',
df11['time']+df11.groupby(['time','day']).cumcount()-1])
.drop(['time','variable'], axis=1)
.rename_axis(['day','time']).sum(level=[0,1]))
df_out = df2.set_index(['day','time']).add(df12, fill_value=0).reset_index()
print(df_out)
输出:
day time total
0 1 14 10.0
1 1 15 50.0
2 1 16 45.0
3 1 17 40.0
4 1 18 45.0
5 1 19 30.0