Как суммировать значения двух фреймов данных с разными формами, когда один является многоуровневым индексом, а другой - нет - PullRequest
1 голос
/ 22 марта 2020

У меня есть следующие фреймы данных: eta1.shape = (8004, 29), eta2.shape = (138,)

eta1= 
        id/uniqueID      var0    var1    var2    var3    var4 ...  var28
        5171/0            10.0    2.8     0.0     5.0     1.0  ...  9.4  
        5171/1            40.9    2.5     3.4     4.5     1.3  ...  7.7  
        5171/2            60.7    3.1     5.2     6.6     3.4  ...  1.0
        ...
        5171/57           0.5     1.3     5.1     0.5     0.2  ...  0.4
        4567/0            1.5     2.0     1.0     4.5     0.1  ...  0.4  
        4567/1            4.4     2.0     1.3     6.4     0.1  ...  3.3  
        4567/2            6.3     3.0     1.5     7.6     1.6  ...  1.6
        ...
        4567/57           0.7     1.4     1.4     0.3     4.2  ...  1.7
       ... 
        9584/0            0.3     2.6     0.0     5.2     1.6  ...  9.7  
        9584/1            0.5     1.2     8.3     3.4     1.3  ...  1.7  
        9584/2            0.7     3.0     5.6     6.6     3.0  ...  1.0
        ...
        9584/57           0.7     1.3     0.1     0.0     2.0  ...  1.7

eta2= 
        id     var28
        5171    67.0
        4567    98.9
        9584    47.7
        ...
        8707    56.3 

В eta2, у меня есть одно значение для каждого id. Мне нужно добавить значение для каждого id в eta2 во все столбцы eta1 с таким же id, как eta = eta1+eta2. Так, например, результаты для id=5171 должны быть следующими:

eta.loc[5171] = 
            id/uniqueID       var0         var1         ...  var28
            5171/0            10.0+67.0    2.8+67.0     ...  9.4+67.0  
            5171/1            40.9+67.0    2.5+67.0     ...  7.7+67.0  
            5171/2            60.7+67.0    3.1+67.0     ...  1.0+67.0
            ...
            5171/57           0.5+67.0     1.3+67.0     ...  0.4+67.0

Выполнение суммы с помощью eta = eta1.add(eta2) дает неверные результаты, поскольку они не имеют одинаковые уровни. Я не могу удалить уровни, они нужны мне для последующих расчетов. Поэтому вместо этого я попытался добавить новый уровень к eta2 и затем сделать сумму, но я получаю эту ошибку:

eta2['uniq_id'] = eta2.groupby('id').cumcount()
eta2 = eta2.set_index(['uniq_id'], append=True)
eta = eta1.add(eta2, level=0)
error: typeError: Join one level between two MultiIndex objects is ambiguous 

Как я могу сделать эту сумму?

1 Ответ

2 голосов
/ 22 марта 2020

Используйте DataFrame.add с Series с eta2['var28'] и axis=0 level=0 параметром:

eta = eta1.add(eta2['var28'], axis=0, level=0)
print (eta)
                var0   var1   var2   var3   var4  var28
id   uniqueID                                          
5171 0          77.0   69.8   67.0   72.0   68.0   76.4
     1         107.9   69.5   70.4   71.5   68.3   74.7
     2         127.7   70.1   72.2   73.6   70.4   68.0
     57         67.5   68.3   72.1   67.5   67.2   67.4
4567 0         100.4  100.9   99.9  103.4   99.0   99.3
     1         103.3  100.9  100.2  105.3   99.0  102.2
     2         105.2  101.9  100.4  106.5  100.5  100.5
     57         99.6  100.3  100.3   99.2  103.1  100.6
9584 0          48.0   50.3   47.7   52.9   49.3   57.4
     1          48.2   48.9   56.0   51.1   49.0   49.4
     2          48.4   50.7   53.3   54.3   50.7   48.7
     57         48.4   49.0   47.8   47.7   49.7   49.4

Если добавлен совокупный счет MultiIndex:

eta2['uniq_id'] = eta2.groupby('id').cumcount()
eta2 = eta2.set_index(['uniq_id'], append=True)

eta = eta1.add(eta2['var28'], axis=0)
print (eta)
                        var0   var1  var2   var3  var4  var28
id   uniqueID uniq_id                                        
4567 0        0        100.4  100.9  99.9  103.4  99.0   99.3
     1        0          NaN    NaN   NaN    NaN   NaN    NaN
     2        0          NaN    NaN   NaN    NaN   NaN    NaN
     57       0          NaN    NaN   NaN    NaN   NaN    NaN
5171 0        0         77.0   69.8  67.0   72.0  68.0   76.4
     1        0          NaN    NaN   NaN    NaN   NaN    NaN
     2        0          NaN    NaN   NaN    NaN   NaN    NaN
     57       0          NaN    NaN   NaN    NaN   NaN    NaN
8707 NaN      0          NaN    NaN   NaN    NaN   NaN    NaN
9584 0        0         48.0   50.3  47.7   52.9  49.3   57.4
     1        0          NaN    NaN   NaN    NaN   NaN    NaN
     2        0          NaN    NaN   NaN    NaN   NaN    NaN
     57       0          NaN    NaN   NaN    NaN   NaN    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...