【发布时间】:2021-05-27 02:59:30
【问题描述】:
我有以下数据集:
ID Date Flag Price Flag_Amt Factor
1 1/1/10 NA 20 NA NA
1 1/2/10 3 20.2 1.05 .5
1 1/3/10 NA 19.2 NA NA
2 1/1/10 5 12 6.50 1.3
2 1/2/10 NA 12.6 NA NA
2 1/2/10 NA 13 NA NA
3 1/1/10 NA 100 NA NA
3 1/2/10 5 88 16.7 .88
3 1/3/10 NA 90 NA NA
我有以下 R dplyr 代码:
df = df %>% group_by(ID) %>% arrange(Date) %>% mutate(New_Factor = ifelse(Flag == 5, (Flag_Amt/Price), Factor))
这将产生以下结果:
ID Date Flag Price Flag_Amt Factor New_Factor
1 1/1/10 NA 20 NA NA NA
1 1/2/10 3 20.2 10.1 .5 .5
1 1/3/10 NA 19.2 NA NA NA
2 1/1/10 5 12 6.50 1.3 1.85
2 1/2/10 NA 12.6 NA NA NA
2 1/2/10 NA 13 NA NA NA
3 1/1/10 NA 100 NA NA NA
3 1/2/10 5 88 16.7 .88 5.27
3 1/3/10 NA 90 NA NA NA
但是,我很难在 Python pandas 中复制它。
以下是我尝试过的一些代码和收到的错误:
df['New_Factor'] = df.groupby(['ID']).apply(lambda x: (x.Price/x.Flag_Amt) if x.Flag == 5 else (x.Factor)))
错误:
Series 的真值是模棱两可的。使用 a.empty、a.bool()、 a.item()、a.any() 或 a.all()。
还有其他方法,也许使用.transform() 和np.where() 来做到这一点?
感谢任何帮助。
谢谢
【问题讨论】:
-
进行groupby和按日期排列的原因?
-
分组和安排:基本上在为每个 ID 隔离标志 5 的影响之后.. 我将为每个 ID 创建我自己的因子.. 所以分组和日期很重要
-
data['New_Factor'] = np.where(data['Flag'] == 5, data['Price']/data['Flag_Amt'], data['Factor']) ...给出相同的结果
-
date 没有以任何方式使用,也没有运行聚合,因此甚至不需要
groupby或group_by -
按照@iamklaus 所说的去做:
df['New_Factor'] = np.where(df['Flag'] == 5, df['Price']/df['Flag_Amt'], df['Factor'])