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

标签 python python-2.7 pandas dataframe elementwise-operations

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

enter image description here

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

对于给定的行,如果 ad_requests 有值,则保留它。否则,为其指定一个值,即上一行的 ad_requests 值减去上一行的impressions。所以在第一个示例中,我们希望以:

enter image description here

我得到了一部分:

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

这就是我卡住的地方。在 else 之后,我想“返回”并访问上一个“行”,尽管我知道这不是 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]

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

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

关于python - 在 pandas 系列中使用前一个 "row"的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733560/

相关文章:

python - 无法在 Django 中导入 View (2.1.4、Python 3.7.0、Win 7)

python - 使用三元运算符分配两个变量

python - 如何在 Pandas 中用多个唯一字符串替换重复值?

python - Pandas dataframe 按一些值填充

python - 将函数递归应用于字符串值的大多数 pythonic 方法

python - 创建 Python 包时出现问题

python - 从 python 列表创建子列表

python - 用 bottle.py 读取 POST 正文

python - 如何使用 python pandas 将此 Json 转换为 CSV?

python - 为什么 R 的 read.csv() 可以从 GitLab URL 读取 CSV 而 pandas 的 read_csv() 不能?