在 pandas 系列中使用前一个 "row" 的值

Using the values of a previous "row" in a pandas series

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

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

对于给定的行,如果 ad_requests 有值,则保留它。否则,给它一个值 前一行的 ad_requests 的值减去前一行的 impressions[ 的值=47=]。所以在第一个例子中,我们希望以:

我得到了一部分:

df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]

这就是我卡住的地方。在 else 之后,我想 "go back" 并访问之前的 "row",尽管我知道这不是 pandas 的用途。 另一件需要注意的事情是,行将始终按列 ad_tag_name 分成三组。如果我 pd.groupby["ad_tag_name"],然后我可以将它变成 list 并开始切片和索引,但是我认为在 pandas 中必须有更好的方法来做到这一点(因为有很多东西)。

Python: 2.7.10

Pandas: 0.18.0

你会想做这样的事情:

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]

警告来自于我们正在更改数据框视图的值,这会影响原始数据框。然而,这是我们希望做的,所以我们并不真正关心它。

(Python 2.7.12 和 Pandas 0.19.0)

编辑:

更改

中的最后一行代码
df['ad_requests'][index]=df['ad_requests'][index-1]-df['impressions'][index-1]

df.at[index,'ad_requests']=df.at[index-1,'ad_requests']-df.at[index-1,'impressions']

消除了抑制任何警告的需要:

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']