Python 从第二个数据帧向数据帧添加值
我有两个像这样的数据帧:Python 从第二个数据帧向数据帧添加值,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个像这样的数据帧: category time day 1 2 3 a 24 1 15 35 20 a 22 1 40 35 15 category day time
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
有没有一个好的方法可以用熊猫来做到这一点?我是否应该将第二个数据帧的索引设置为“天”和“时间”,以便能够快速检索它们?我有一个非常大的数据集,所以我选择的方法是快速的,这对我来说很重要 让我们看看这是否更快:
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
为什么第一个数据帧的列名重复?你能提供一个吗?哦。我partHi上的一个简单错误。我相信这是一个很好的解决方案,但不幸的是,我很难理解调整它以适应我的案例的步骤。我现在稍微改变了我的示例,以便更接近我的用例。我添加了一个额外的列,我也使用它来查找匹配的行,称为category。此外,我的示例现在显示了新的一天开始时时间是如何变化的。我所有的行都按正确的顺序排列,所以我仍然希望在午夜左右敲打时添加到下一行。你能帮我调整你的答案以适应我编辑过的问题吗?非常感谢你的帮助@达格伦:这个问题有点复杂。我认为您需要创建一个datetime列,这样您就可以添加小时来处理从午夜到早晨的添加。