我试图按熊猫DataFrame中的一列进行分组,并应用一个ifelse函数,该函数具有一个使用列值的测试,并根据测试返回不同的true和false值。
我使用data.table包在R中轻松实现了这一点,我基本上希望在Python中使用pandas来实现。
library(data.table)
dat <- data.table(
i_n = c('a', 'b', 'b', 'd', 'e', 'f', 'g', 'h', 'h', 'i'),
m_b_r = c(0, 1, 0, 0, 0, 0, 0, 1, 0, 0),
o_q = c(1, 8, 8, 1, 1, 1, 1, 2, 2, 1),
a_q = c(1, 5, 15, 1, 57, 1, 5, 1, 1, 1)
)
dat <- dat[, ('p_q') := ifelse(
test =get('m_b_r') == 1,
yes =get('a_q'),
no =get('o_q') - data.table::shift(get('a_q'), n = 1L, type = 'lag', fill = 0 )
), by = 'i_n']
答案 0 :(得分:1)
我认为需要numpy.where
和DataFrameGroupBy.shift
:
shifted = dat.groupby('i_n')['a_q'].shift().fillna(0)
dat['p_q'] = np.where(dat['m_b_r'] == 1, dat['a_q'], dat['o_q'] - shifted)
print (dat)
i_n m_b_r o_q a_q p_q
0 a 0 1 1 1.0
1 b 1 8 5 5.0
2 b 0 8 15 3.0
3 d 0 1 1 1.0
4 e 0 1 57 1.0
5 f 0 1 1 1.0
6 g 0 1 5 1.0
7 h 1 2 1 1.0
8 h 0 2 1 1.0
9 i 0 1 1 1.0
可以调用自定义函数,但更快的是第一个解决方案:
def f(x):
x['p_q'] = np.where(x['m_b_r'] == 1, x['a_q'], x['o_q'] - x['a_q'].shift().fillna(0))
return x
df = dat.groupby('i_n').apply(f)
print (df)
i_n m_b_r o_q a_q p_q
0 a 0 1 1 1.0
1 b 1 8 5 5.0
2 b 0 8 15 3.0
3 d 0 1 1 1.0
4 e 0 1 57 1.0
5 f 0 1 1 1.0
6 g 0 1 5 1.0
7 h 1 2 1 1.0
8 h 0 2 1 1.0
9 i 0 1 1 1.0
答案 1 :(得分:0)
或者python中的tidyverse
方式:
>>> from datar.all import c, f, tibble, group_by, mutate, if_else, lag
>>>
>>> dat = tibble(
... i_n = c('a', 'b', 'b', 'd', 'e', 'f', 'g', 'h', 'h', 'i'),
... m_b_r = c(0, 1, 0, 0, 0, 0, 0, 1, 0, 0),
... o_q = c(1, 8, 8, 1, 1, 1, 1, 2, 2, 1),
... a_q = c(1, 5, 15, 1, 57, 1, 5, 1, 1, 1)
... )
>>>
>>> dat >> group_by(f.i_n) >> mutate(
... p_q=if_else(
... f.m_b_r == 1,
... f.a_q,
... f.o_q - lag(f.a_q, default=0)
... )
... )
i_n m_b_r o_q a_q p_q
<object> <int64> <int64> <int64> <int64>
0 a 0 1 1 1
1 b 1 8 5 5
2 b 0 8 15 3
3 d 0 1 1 1
4 e 0 1 57 1
5 f 0 1 1 1
6 g 0 1 5 1
7 h 1 2 1 1
8 h 0 2 1 1
9 i 0 1 1 1
[Groups: i_n (n=8)]
我是 datar
包的作者。如果您有任何问题,请随时提交问题。