从R到Python重写groupby,if-else进行排列和变异

时间:2019-02-04 15:01:50

标签: python r pandas code-translation

我正在尝试将我的代码从R重写为Python。我很难重写一些涉及group_byarrangemutate的代码。我在Python中尝试过transformapply,但没有成功。

在R中,我的代码如下所示:

S1 = S1 %>% group_by(ID) %>% arrange(Date) %>% mutate(New_Factor = ifelse(r_type == 5, (1+(Price/Last_Price)), Old_Factor/lag(Old_Factor)))

但是,我很难用Python重写此代码。到目前为止,这是我想出的:

s1['New_Factor'] = s1.groupby(['ID'],group_keys=False).apply(lambda g: (1+(Price/Last_Price)) if g.type == 5 else (Old_Factor/lag_value))

其中lag_value定义为:

lag_value = s1['Old_Factor'].shift(1)

我得到的错误是:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

我还想知道.tranform()是否是解决此问题的更好方法?请让我知道-我的代码转换可能会做很多。

1 个答案:

答案 0 :(得分:0)

这是你想要的吗?

>>> from datar.all import f, tibble, group_by, arrange, mutate, if_else, lag
>>> 
>>> S1 = tibble(
...   ID=[1,1,2,2],
...   Date=["1/1/2021", "1/1/1997", "3/3/2020", "12/1/2020"],
...   Price=[3.23, 1.23, 5.33, 9.88],
...   Last_Price=[1.22,2.21,3.21,2.11],
...   Old_Factor=[3,4,5,6],
...   r_type=[5,5,6,6]
... )
>>> 
>>> S1 >> group_by(f.ID) >> arrange(f.Date) >> mutate(
...     New_Factor=if_else(
...         f.r_type==5, 
...         1+f.Price/f.Last_Price, 
...         f.Old_Factor/lag(f.Old_Factor)
...     )
... )
       ID       Date     Price  Last_Price  Old_Factor  r_type  New_Factor
  <int64>   <object> <float64>   <float64>     <int64> <int64>   <float64>
0       1   1/1/1997      1.23        2.21           4       5    1.556561
1       1   1/1/2021      3.23        1.22           3       5    3.647541
2       2  12/1/2020      9.88        2.11           6       6         NaN
3       2   3/3/2020      5.33        3.21           5       6    0.833333

[Groups: ID (n=2)]

我是 datar 包的作者。如果您有任何问题,请随时提交问题。