Создание фрейма данных на основе условий других фреймов

df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})

df.groupby(['sp', 'mt']).apply(lambda grp: grp.nlargest(1, 'count'))
1
задан Tiw 22 March 2019 в 15:44
поделиться

3 ответа

Использование np.where дважды

np.where(sd[0]==0,0,np.where(dd.eq(0).all(1),'OK',dd.mask(dd==0).mean(1)))
Out[232]: 
array(['0', '0.3333333333333333', '-0.3333333333333333', '0.5', '0.65',
       'OK', '0'], dtype='<U32')
0
ответ дан Wen-Ben 22 March 2019 в 15:44
поделиться

Используя numpy.select:

c1 = sd[0].eq(0)
c2 = dd.eq(0).all(1)

res = np.select([c1, c2], [0, 'OK'], dd.where(dd.ne(0)).mean(1))
pd.Series(res)

0                      0
1     0.3333333333333333
2    -0.3333333333333333
3                    0.5
4                   0.65
5                     OK
6                      0
dtype: object
0
ответ дан user3483203 22 March 2019 в 15:44
поделиться

спасибо за вашу помощь. Мне удалось сделать это совсем по-другому. Я использовал:

res1 = pd.Series(np.where(sd[0]==0, 0, dd[dd != 0].mean(axis=1))).fillna('OK')

Разница в том, что он возвращает значения с плавающей запятой (для строк, которые не «ОК»), а не строки. Это также, кажется, немного быстрее.

0
ответ дан cornisto 22 March 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: