Pandas: добавление одного фрейма данных индекса поверх мультииндексного фрейма данных по индексу - PullRequest
1 голос
/ 18 июня 2020

Довольно новый и неопытный с pandas, но я чувствую, что здесь есть ответ, я просто еще не совсем вижу себя. У меня есть два фрейма данных, один с одним индексом и m числовыми строками. Другой фрейм данных имеет уникальные m индексов в первом индексе и может иметь переменное количество индексов во втором индексе.

Пример:

df_offset DataFrame, который я хотел бы добавить

    0
0   0
1   21080064
2   42729472
3   65017856
4   86253568
...
49  311934976

df_epocs_idx DataFrame Я хотел бы добавить:

        onset   offset
0   0   190722  923472
    1   2387988 3120738
    2   4585254 5318004
    3   6782520 7515270
    4   8979786 9712536
... ... ... ...
49  5   1289179 1313604
    6   1533320 1557745
    7   1777461 1801886
    8   2021602 2046027
    9   2265743 2290168

Результат, который мне нужен:

        onset   offset
0   0   190722  923472
    1   2387988 3120738
    2   4585254 5318004
    3   6782520 7515270
    4   8979786 9712536
... ... ... ...
49  5   313224155 313248580,
    6   313468296 313492721,
    7   313712437 313736862,
    8   313956578 313981003,
    9   314200719 314225144

Я пробовал df_epocs_idx.add(df_offset, axis='rows') что дает ошибку: ValueError: cannot join with no overlapping index names и df_epocs_idx.add(df_offset, axis='rows', level=0), которые, кажется, просто добавляют новый столбец на передний план, а затем дают мне кучу NaN. Я бы не хотел использовать просто для l oop, поскольку я узнал, что это обычно неэффективно при работе с большими фреймами данных, которые в будущем могут превратиться в.

1 Ответ

0 голосов
/ 18 июня 2020

Я думаю, вам нужно присвоить df_offset те же имена столбцов, что и df_epocs_idx. Таким образом, создайте два столбца в df_offset, повторяя значения, которые у вас есть сейчас в одном столбце, изменив имена столбцов на «начало» и «смещение».

Я составил этот пример, чтобы воспроизвести вашу ситуацию, и он может вам помочь.

Новый манекен df_epocs_idx:

df_epocs_idx  = pd.DataFrame({'1': [0, 0, 0, 1, 1,1,2,2,2],'2': [0, 1, 2, 0, 1,2,0,1,2],
                 'onset': np.random.rand(9),"offset": np.random.rand(9)})

df_epocs_idx= df_epocs_idx.set_index(["1","2"])
df_epocs_idx

        onset    offset
1 2                    
0 0  0.100127  0.231690
  1  0.582593  0.209367
  2  0.598472  0.863339
1 0  0.079973  0.459830
  1  0.245197  0.874727
  2  0.717778  0.041785
2 0  0.750384  0.123909
  1  0.862120  0.169458
  2  0.056572  0.744763

Новый манекен df_offset:

df_offset = pd.DataFrame({"onset": [3,10,100],"offset":[3,10,100]})
df_offset

  onset offset
0   3   3
1   10  10
2   100 100

Суммируйте два фрейма данных на основе уровня 0:

df_epocs_idx.add(df_offset, level=0)

Дает:

          onset      offset
1 2                        
0 0    3.100127    3.231690
  1    3.582593    3.209367
  2    3.598472    3.863339
1 0   10.079973   10.459830
  1   10.245197   10.874727
  2   10.717778   10.041785
2 0  100.750384  100.123909
  1  100.862120  100.169458
  2  100.056572  100.744763
...