从第二个数据帧向Pandas数据帧添加值

时间:2018-06-12 14:58:38

标签: python pandas dataframe

我有两个像这样的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”以便能够快速检索它们吗?我有一个非常大的数据集,所以我选择的方法很快就很重要。

1 个答案:

答案 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