Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从第二个数据帧向数据帧添加值_Python_Pandas_Dataframe - Fatal编程技术网

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列,这样您就可以添加小时来处理从午夜到早晨的添加。