Python 使用前一个";“世界其他地区”;熊猫系列
我有一个看起来像这样的CSV(当将它放入带有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"]] 这就是我被卡住的地方
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']