将条件应用于分组数据

时间:2019-08-16 19:49:04

标签: python pandas dataframe conditional-statements pandas-groupby

我之前对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)

非常感谢您的帮助!

2 个答案:

答案 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