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

У меня есть два кадра данных (df1 и df2), которые используются pd.groupby из одного и того же кадра данных. Я хочу условно создать другой фрейм данных (df_result) на основе следующей логики c:

  1. Структура / ячейка df_result скопирована из df1
  2. Для количества <6 в df1 используйте вместо этого соответствующее значение в df2. </li>

INPUT1: df1

Type_lv1  Type_lv2          diff
                         count mean
t1           t_a              1    0.02
             t_b              12   0.01
t2           t_a              5    0.12
             t_b              22   0.11

INPUT2: df2

Type_lv1         diff
               count mean
t1             13    0.011
t2             27    0.11

ВЫХОД: df_result

Type_lv1  Type_lv2          diff_result
                             mean
t1           t_a              0.011
             t_b              0.01
t2           t_a              0.11
             t_b              0.11

В приведенных выше примерах данных первая roq и третья строка в df_result взяты из df2, поскольку значения в df1 равны 1 и 5, что меньше порогового значения 6. Я пытался найти связанные образцы в предыдущих вопросах, но мог получить Я хочу. Может ли кто-нибудь дать мне несколько указаний?

Спасибо !!

1 Ответ

0 голосов
/ 07 апреля 2020

Идея состоит в том, чтобы добавить второй уровень от df1 до df2 для MultiIndex, поэтому возможен перераспределение по условию на последнем шаге, только необходимое совпадение с первым уровнем MultiIndex в обоих DataFrame s:

m = df1[('diff','count')] < 6

mux = pd.MultiIndex.from_product([df2.index.unique(), 
                                  df1.index.get_level_values(1).unique()])
df3 = df2.reindex(mux, level=0)

df1.loc[m, ('diff','mean')] = df3[('diff','mean')]
print (df1)
                   diff       
                  count   mean
Type_lv1 Type_lv2             
t1       t_a          1  0.011
         t_b         12  0.010
t2       t_a          5  0.110
         t_b         22  0.110
...