5

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

在此处输入图像描述

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

对于给定的行,如果ad_requests有值,则不要理会它。否则,将前一行的ad_requests值减去前一行的impresions值给它。所以在第一个例子中,我们希望得到:

在此处输入图像描述

我部分到达那里:

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

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

蟒蛇:2.7.10

熊猫:0.18.0

4

1 回答 1

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]

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

(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']
于 2016-11-22T10:44:04.943 回答