【问题标题】:Using the values of a previous "row" in a pandas series使用熊猫系列中前一个“行”的值
【发布时间】: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


【解决方案1】:

你会想做这样的事情:

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

【讨论】:

  • 我知道我需要以某种方式使用先前元素的索引,但忘记了enumerate()。而且我知道最终的解决方案会像大多数基于 pandas 的解决方案一样简短而简洁。感谢您采用这种优雅的方法。
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 2017-11-01
  • 2018-05-14
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2021-10-27
  • 2015-08-24
相关资源
最近更新 更多