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

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

ВХОД1: 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

ВХОД2: 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. Я пытался найти связанные образцы в прошлых вопросах, но смог получить то, что хочу . Может ли кто-нибудь дать мне несколько направлений?

Благодарность!!

0
lamiren 7 Апр 2020 в 14:51

1 ответ

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

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
0
jezrael 7 Апр 2020 в 15:08
При попытке mux = pd.MultiIndex.from_product([df2.index.unique(), df1.index.get_level_values(1).unique()]) произошла ошибка: NotImplementedError: isna is not defined for MultiIndex. У вас есть какие-либо предложения?
 – 
lamiren
8 Апр 2020 в 03:29
- Какая у вас версия панды? И пропущенное значение находится в print (df2.index.unique()) или df1.index.get_level_values(1).unique() или в обоих?
 – 
jezrael
8 Апр 2020 в 07:25