【发布时间】:2017-04-05 15:19:24
【问题描述】:
我有一个看起来像这样的 CSV(当带入熊猫数据框时
read_csv(),看起来一样)。
我想根据以下逻辑更新列 ad_requests 中的值:
对于给定的行,如果 ad_requests 有值,则不要理会它。否则,将上一行的 ad_requests 值减去上一行 展示次数 的值。所以在第一个例子中,我们希望得到:
我得到了部分:
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 并开始切片和索引,但同样,我认为在熊猫中必须有更好的方法来做到这一点(因为有很多东西)。
Python:2.7.10
熊猫:0.18.0
【问题讨论】:
-
提示:
df.ad_requests.ffill() - df.impressions.cumsum().shift()让你成功。 -
有趣。使用这种方法,虽然前几行空白行的值略有,但最终变为负数:imgur.com/a/k7faf
-
这就是为什么它是一个提示而不是一个完整的解决方案。每次 ad_requests 为非零或类似的值时,cumsum 都需要重置为 0。
标签: python python-2.7 pandas dataframe elementwise-operations