我之前对R问过类似的问题,但是我现在正在尝试在python中复制相同的任务。我在这篇文章中得到的解决方案与我正在寻找的解决方案相似。
Using sapply on column with missing values
基本上,我需要根据分组数据有条件地创建一个新列。
以下是一些示例数据:
import pandas as pd
test = pd.DataFrame(data={"Group":[1,1,1,1,1,1,2,2,2,2,2,2],"time":
[0,1,2,3,4,5,0,1,2,3,4,5],"index":
[1,1.1,1.4,1.5,1.6,1.67,1,1.4,1.5,1.6,1.93,1.95]})
我现在要创建一个新列“ new_index”,该列将等于时间3之前的索引,但是将从时间3开始以不同的速率增长,例如10%。所以现在数据看起来像
test2 = pd.DataFrame(data={"Group":[1,1,1,1,1,1,2,2,2,2,2,2],"time":
[0,1,2,3,4,5,0,1,2,3,4,5],"index":
[1,1.1,1.4,1.5,1.6,1.67,1,1.4,1.5,1.6,1.93,1.95],"new_index":
[1,1.1,1.4,1.54,1.694,1.8634,1,1.4,1.5,1.65,1.815,1.9965]})
我尝试了一些类似这样的代码,但是它不起作用
def gr_adj(df):
if df["time"] <= 2:
return df["index"]
else:
return np.cumprod(df["new_index"])
test["new_index] = test.groupby("Group",group_keys=False).apply(gr_adj)
非常感谢您的帮助!
答案 0 :(得分:1)
这是使用groupby
的一种方法,第一个将时间大于3的所有索引屏蔽为1.1,然后通过不包含不需要更新的内容来对输出进行切片,然后cumprod
得到s=test['index'].where(test['time']<3,1.1).loc[test['time']>=2].groupby(test['Group']).cumprod()
test.loc[test['time']>=2,'index']=s
test
Out[290]:
Group time index
0 1 0 1.0000
1 1 1 1.1000
2 1 2 1.4000
3 1 3 1.5400
4 1 4 1.6940
5 1 5 1.8634
6 2 0 1.0000
7 2 1 1.4000
8 2 2 1.5000
9 2 3 1.6500
10 2 4 1.8150
11 2 5 1.9965
,然后将其分配回
<div class="col control-section">
<div class="content-wrapper">
@(Html.EJS().Schedule("schedule")
.Width("100%")
.Height("650px")
.EventRendered("onEventRendered")
//.EventSettings(new ScheduleEventSettings { DataSource = ViewBag.datasource })
.EventSettings(e => e.DataSource(d => d.Url("Home/GetAppointmentData").CrudUrl("Home/SaveAppointmentData").Adaptor("UrlAdaptor").CrossDomain(true)))
.SelectedDate(DateTime.Now).Render()
)
</div>
</div>
答案 1 :(得分:1)
这是另一个答案,如果时间> 3,实际上会使您的索引增加10%:
import pandas as pd
test = pd.DataFrame(data={"Group":[1,1,1,1,1,1,2,2,2,2,2,2],"time": [0,1,2,3,4,5,0,1,2,3,4,5],"index": [1,1.1,1.4,1.5,1.6,1.67,1,1.4,1.5,1.6,1.93,1.95]})
def gr_adj(row):
if row["time"] <= 2:
return row["index"]
else:
return row["index"] + (row["index"] * 0.1)
test["new_index"] = test.apply(gr_adj, axis=1)
输出:
Group time index new_index
0 1 0 1.00 1.000
1 1 1 1.10 1.100
2 1 2 1.40 1.400
3 1 3 1.50 1.650
4 1 4 1.60 1.760
5 1 5 1.67 1.837
6 2 0 1.00 1.000
7 2 1 1.40 1.400
8 2 2 1.50 1.500
9 2 3 1.60 1.760
10 2 4 1.93 2.123
11 2 5 1.95 2.145
这会将行的值用作函数的输入,并将其应用于每一行。它以index
+ 10%的速度增长新索引,如果time >= 2
。