Создание фрейма данных на основе условий других фреймов - PullRequest
1 голос
/ 22 марта 2019

У меня есть два кадра данных: столбец s-1, столбцы d-3

s = {0: [0, 0.3, 0.5, -0.1, -0.2, 0.7, 0]}
d = {0: [0.1, 0.2, -0.2, 0, 0, 0, 0], 1: [0.3, 0.4, -0.7, 0, 0.8, 0, 0.1], 2: [-0.5, 0.4, -0.1, 0.5, 0.5, 0, 0]}
sd = pd.DataFrame(data=s)
dd = pd.DataFrame(data=d)
result = pd.DataFrame()

Я хочу получить результирующий кадр данных (1 столбец) на основе значений в этих двух:
1. Когдазначение в sd = 0, затем 0
2. Когда значение в sd != 0, тогда проверьте, есть ли для этой строки хотя бы одно ненулевое значение в dd, если да, - получите среднее значение ненулевых значений, если нетreturn OK

Вот что я хотел бы получить:

results:
0   0
1   -0,033
2   -0,333
3   0,5
4   0,65
5   OK
6   0

Я знаю, что могу использовать dd[dd != 0].mean(axis=1) для вычисления среднего ненулевого значения для строки, но я нене знаю, как соединить все эти 3 условия вместе

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Использование 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
1 голос
/ 22 марта 2019

Использование 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 голосов
/ 23 марта 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...