Панды: Как получить первый положительный номер? - PullRequest
2 голосов
/ 01 июля 2019

У меня есть датафрейм для панд:

name    a    b    c
jack   -10  -6   -10
bill   -6   -3   -5
ray    -3   -12  -9 
pew     4   -23  -2  
shaun   12   3    2  
mitch   3    5    2

Как я могу создать новый фрейм данных, который принимает первое положительное значение из каждого соответствующего столбца (a, b, c) и делит все значения в этом столбце с выбранным первым положительным значением этого столбца и сохраняет результат деления на месте всех ценностей. Вывод должен выглядеть следующим образом

name    a      b      c
jack   -10/4  -6/3   -10/2
bill   -6/4   -3/3   -5/2
ray    -3/4   -12/3  -9/2 
pew     4/4   -23/3  -2/2  
shaun   12/4   3/3    2/2  
mitch   3/4    5/3    6/2

Ответы [ 3 ]

3 голосов
/ 01 июля 2019

Вот еще один способ:

m=df.set_index('name')
final=m.div(m.mask(m.lt(0)).bfill().iloc[0]).reset_index()

    name     a         b    c
0   jack -2.50 -2.000000 -5.0
1   bill -1.50 -1.000000 -2.5
2    ray -0.75 -4.000000 -4.5
3    pew  1.00 -7.666667 -1.0
4  shaun  3.00  1.000000  1.0
5  mitch  0.75  1.666667  1.0
1 голос
/ 01 июля 2019

Вы можете проверить, какие значения в кадре данных больше, чем 0, и взять idxmax (сначала True), а затем разделить по столбцам полученные значения.

ix = df.loc[:,'a':].gt(0).idxmax()
df.loc[:,'a':] = df.loc[:,'a':].div(df.lookup(ix.values, ix.index))

   name     a         b    c
0   jack -2.50 -2.000000 -5.0
1   bill -1.50 -1.000000 -2.5
2    ray -0.75 -4.000000 -4.5
3    pew  1.00 -7.666667 -1.0
4  shaun  3.00  1.000000  1.0
5  mitch  0.75  1.666667  1.0
0 голосов
/ 01 июля 2019

a/a.head(1) (панды должны позаботиться об остальном)

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