Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用前一个";“世界其他地区”;熊猫系列_Python_Python 2.7_Pandas_Dataframe_Elementwise Operations - Fatal编程技术网

Python 使用前一个";“世界其他地区”;熊猫系列

Python 使用前一个";“世界其他地区”;熊猫系列,python,python-2.7,pandas,dataframe,elementwise-operations,Python,Python 2.7,Pandas,Dataframe,Elementwise Operations,我有一个看起来像这样的CSV(当将它放入带有 read\u csv(),看起来一样) 我想根据以下逻辑更新列ad_requests中的值: 对于给定的行,如果ad_请求有一个值,则不使用它。否则,给它一个值,前一行的ad_请求值减去前一行的印象值。因此,在第一个示例中,我们希望以以下内容结束: 我得到了一部分: df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]] 这就是我被卡住的地方

我有一个看起来像这样的CSV(当将它放入带有
read\u csv()
,看起来一样)

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

对于给定的行,如果ad_请求有一个值,则不使用它。否则,给它一个值,前一行的ad_请求值减去前一行的印象值。因此,在第一个示例中,我们希望以以下内容结束:

我得到了一部分:

df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]
这就是我被卡住的地方。在
else
之后,我想“返回”并访问上一行,尽管我知道这不是熊猫的用途。 另一件需要注意的事情是,行总是按列ad_tag_name分成三组。如果我
pd.groupby[“ad_tag_name”]
,我就可以把它变成一个
列表
,并开始切片和索引,但我认为在pandas中一定有更好的方法(因为有很多东西)

Python:2.7.10


熊猫: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]

无需抑制任何警告:

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

提示:
df.ad\u requests.ffill()-df.impressions.cumsum().shift()
让您半途而废。很有趣。使用这种方法,前几行的值稍微偏离,然后最终变为负值:这就是为什么它只是一个提示,而不是一个完整的解决方案。每次ad_请求为非零或类似情况时,总和都需要重置为0。我知道我需要以某种方式使用前面元素的索引,但忘记了
enumerate()
。我知道最终的解决方案会简洁明了,就像大多数基于熊猫的解决方案一样。谢谢你这种优雅的方式。
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']