使用熊猫系列中前一个"行"的值

Pyd*_*man 5 python dataframe python-2.7 pandas elementwise-operations

我有一个看起来像这样的CSV(当带入一个pandas Dataframe时 read_csv(),它看起来一样).

在此输入图像描述

我想根据以下逻辑更新列ad_requests中的值:

对于给定的行,如果ad_requests具有值,请不管它.否则,把它的值上一行对价值AD_REQUESTS减去前行的价值为印象.所以在第一个例子中,我们希望最终得到:

在此输入图像描述

我部分到了那里:

df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]
Run Code Online (Sandbox Code Playgroud)

这就是我陷入困境的地方.之后else,我想"回去"并访问前一个"行",但我知道这不是大熊猫的意思.另外需要注意的是,行总是按行ad_tag_name分组为三个.如果我pd.groupby["ad_tag_name"],我可以把它变成一个list并开始切片和索引,但同样,我认为必须有更好的方法在熊猫中做到这一点(因为有很多东西).

Python:2.7.10

熊猫:0.18.0

Roj*_*jan 3

你会想做这样的事情:

pd.options.mode.chained_assignment = None #suppresses "SettingWithCopyWarning"
for index, elem in enumerate(df['ad_requests']):
    if pd.isnull(elem):
        df['ad_requests'][index]=df['ad_requests'][index-1]-df['impressions'][index-1]
Run Code Online (Sandbox Code Playgroud)

该警告来自这样一个事实:我们正在更改数据帧视图的值,这会影响原始数据帧。然而,这就是我们希望做的,所以它并不真正关心我们。

(Python 2.7.12 和 Pandas 0.19.0)

编辑:

将最后一行代码更改为

df['ad_requests'][index]=df['ad_requests'][index-1]-df['impressions'][index-1]
Run Code Online (Sandbox Code Playgroud)

df.at[index,'ad_requests']=df.at[index-1,'ad_requests']-df.at[index-1,'impressions']
Run Code Online (Sandbox Code Playgroud)

无需抑制任何警告:

for index, elem in enumerate(df['ad_requests']):
    if pd.isnull(elem):
        df.at[index,'ad_requests']=df.at[index-1,'ad_requests']-df.at[index-1,'impressions']
Run Code Online (Sandbox Code Playgroud)